brunch

You can make anything
by writing

C.S.Lewis

by crtlife noah Jun 05. 2023

사람의 관점에서 보는 프로그래밍 언어의 소수점

프로그래밍 언어의 소수점과 일반 소수점의 차이

* 개인적으로 고민하고 정리한 내용이므로 잘못된 내용이 있다면 댓글 부탁드립니다.

 

정확하고 빠른 계산을 해줄 것 같은 컴퓨터가 소수점에 연산에 대해서 오류를 발생시킨다는 내용은 해당 내용을 자세히 모르는 사람 입장에서는 정말 믿기 힘든 말이다. 하지만 아래의 간단한 예제로 우리는 이런 일이 발생한다는 것을 알 수 있다.


예제 A)

코드 : 
print(0.3 + 0.6)

결과 : 
0.8999999999999999


0.3 + 0.6 은 0.9라는 것을 우리도 쉽게 계산할 수 있지만 컴퓨터는 하지 못한다. 이러한 개념에 대해서 프로그래밍 언어를 배우는 초기에 부동소수점 오류에 대한 개념으로 소수점을 표현하는 컴퓨터에 대한 자세한 원리를 공부를 하게 된다. 그런데 해당 공부를 하게 되면 프로그래밍 언어에서는 이진수를 다루어서 우리가 아는 십진수 소수점을 계산하면 정확히 떨어지는 값이 아니어서 오류가 발생할 수 있다는 것을 알 수 있지만 우리가 정확히 프로그래밍 언어에 존재하는 소수점을 어떻게 받아들여야 할지는 설명을 해주지 않는다.


사실 위의 개념을 오류라고 인식하고 배우는 것도 이상하게 느껴진다. 오류라는 표현을 쓰면 프로그래밍 언어가 많은 사람들이 일반적으로 알고 있는 오류를 오랜 시간 동안 고치지 않고 유지해 놨다는 것인데 계속 꾸준히 지속적으로 발전하고 있는 프로그래밍 언어에 그런 일이 방치되고 있다는 것은 말이 되지 않는 생각이다. 정확히는 소수점을 사용하는 사용자 관점에서 오류이고 프로그래밍 언어는 해당 연산을 의도했다고 보는 것이 맞다. 그러면 프로그래밍 언어의 의도가 무엇이고 프로그래밍 언어에서 소수점은 무엇일까? 프로그래밍 언어의 의도는 Reference에 나온 내용들을 참조하면 왜 그렇게 구현되어 있는지 알 수 있으므로 해당 글에서는 프로그래밍 언어에서 소수점이 사람들의 관점에서 무엇인가에 대해서만 초점을 맞추도록 하겠다. 그러면 질문을 좀 더 예제에 나온 내용을 이용하여 쉽게 바꿔서 표현해 보겠다.


프로그래밍 언어에서 우리가 알고 있는 0.9이라는 값은 무엇인가?


프로그래밍 언어에서 0.9라는 값을 알아보기 위해서 파이썬에서 아래의 값들을 출력해 보았다.


예제 B)

코드 : 
print(0.89999999999999999)
print(0.89999999999999998)
print(0.89999999999999997)

결과:
0.9
0.9
0.9


해당 실험을 통해 우리는 우리가 원하는 대답을 쉽게 파악할 수 있다. 바로, 프로그래밍 언어에서 0.9를 의미하는 값은 하나가 아니라는 것이다. 즉, 프로그래밍 언어에서 우리가 생각하고 있는 소수점의 값은 여러 개 일 수 있다는 것이다. 따라서, 0.3 + 0.6도 실제로 컴퓨터가 생각하는 여러 숫자 중 0.3과 0.6을 의미하는 숫자들의 덧셈이 이루어져서 0.8999999999999999이라는 값이 나오게 된다. 

(주의 : 여기서 혹시나 예제 B)의 0.89999999999999999이 0.9이므로 예제 A)의 결과도 0.9가 나온 것이라고 잘못 착각할 수 있는데 예제 A)의 0.8999999999999999라는 숫자는 예제 B)의 값보다 소수점 끝에 9가 하나가 없으므로 서로 다른 숫자이다.)


그러면 질문을 다시 온전히 표현해 보면 프로그래밍 언어에서 우리가 알고 있는 십진수 소수점 값은 무엇인가?라는 질문에 답을 하면 


이진수로 표현이 힘든 십진수 소수점 값의 경우에 크기 차이가 작은 여러 개의 소수점의 값들이 해당 소수점 값을 의미한다. 


따라서, 우리가 알고 있는 소수점 값이 우리가 의도하지 않은 값으로 인식하고 프로그래밍 언어에서 계산할 수 있으므로 위와 같은 사용자 코드의 오류가 나오게 된다. 이진수와 십진수라는 표현이 들어가서 어렵다면 아래의 개념으로 이해하면 된다.


프로그래밍 언어에서 소수점의 값은 동일한 하나의 값 또는 여러 개의 차이가 작은 연속적인 소수점들로 이루어질 수 있다. 


글을 쓴 의도

이와 같은 글을 쓰게 된 의도에서 대해서 추가적으로 설명을 하면 소수점 오류에 대해서 공부하다가 이런 생각이 들었다. 프로그래밍 언어에서 우리가 소수점을 입력할 수 있다는 개념은 프로그래밍 언어에서 해당 소수점에 대해서 정의를 내렸다는 것인데 기존의 내용들을 공부하다 보면 사람 관점에서 이해를 해야 하는 쉬운 정의에 대해서는 설명해주지 않고 컴퓨터 관점에서 오류가 발생할 수 있으므로 조심하자는 내용과 오류가 발생하는 프로그래밍 언어 관점의 복잡한 원리만 듣게 된다. 그런데 막상 이런 내용만 듣게 되면 우리에게 직관적으로 이해가 되지 않기 때문에 굉장히 보수적인 프로그래밍을 하게 된다. 그래서 사람의 관점에서 쉽게 이해할 수 있는 프로그래밍 언어 소수점의 정의가 없을까에 대해서 고민을 하다가 스스로 정의를 한번 내려보았다.


Reference

https://docs.python.org/ko/3/library/decimal.html


https://dojang.io/mod/page/view.php?id=2466

https://wikidocs.net/106276


 

매거진의 이전글 왜? 프로그래밍 언어는 왜? (1)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari