6. Floating Point Numbers (부동 소수점)

2024. 3. 1. 23:47CS - Roadmap.sh/6. Floating Point Numbers

Floating Point Numbers

Floating point numbers are numbers that have a decimal point in them. They are used to represent real numbers. For example, 3.14 is a floating point number. 3 is not a floating point number because it does not have a decimal point in it.

 

부동 소수점 숫자는 소수점이 포함된 숫자입니다. 실수를 표현하는 데 사용됩니다. 예를 들어 3.14는 부동 소수점 숫자입니다. 3은 소수점이 포함되어 있지 않으므로 부동 소수점 숫자가 아닙니다.


 

Floating Point Numbers(부동소수점)

부동 소수점이란 컴퓨터에서 실수를 표현하는 방법 중 하나입니다. 이는 실수를 정확하게 표현하기 위해 고안된 방법이며, '부동'이라는 말이 붙은 이유는 소수점의 위치가 고정되어 있지 않고 이동할 수 있기 때문입니다.

 

부동소수점은 일반적으로 세 부분으로 나눠져 있습니다.

1. 부호 비트 (Sign bit)

 숫자가 양수인지 음수인지 나타냅니다.

2. 지수부 (Exponent)

 실제 소수점의 위치를 결정합니다.

3. 가수부 (mantissa or fraction)

 실제 숫자 정보를 담고 있습니다.

 

부동소수점의 특징

부동소수점은 실수를 표현할 수 있어 매우 유용하지만, 한계가 있습니다. 정확도의 문제가 대표적입니다.

이는 모든 실수를 표현 할 수 없어 근삿값으로 표현되기 때문입니다. 이로 인해 무한루프 등의 문제가 발생할 수 있습니다. 또한 부동소수점 연산은 정수 연산에 비해 연산속도가 느린 편입니다.

 

0.1 + 0.2 != 0.3 ????

 

실제로 파이썬에서 0.1 + 0.2 와 0.3을 비교해보면 0.1 + 0.2 == 0.3 이 False 로 나옴을 볼 수 있습니다.

 

왜 이런 현상이 나올까요?

 

컴퓨터는 숫자를 2진수로 표현합니다. 그렇다면 부동소수점을 표현하기 위해서는 어떻게 할까요?

이는 IEEE 754 표준을 통해서 약속을 했습니다. (https://ko.wikipedia.org/wiki/IEEE_754)

 

IEEE 754 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다. ±0 등의 수와 무한, NaN 등의 기호를 표시하는 법과 이러한 수에 대한

ko.wikipedia.org

위 표준에 따르면 부동 소수점은 1개의 부호비트, 8개의 지수 비트, 23개의 가수부 (mantissa or fraction) 로 구성됩니다.

출처 : 위키피디아

 

0.1과 0.2를 부동소수점으로 표현해보겠습니다.

0.1은 2진수로 표현하면 무한 반복하는 소수가 되며, 이를 부동 소수점으로 표현하면 근사치로 표현이됩니다.

0.2도 마찬가지입니다.

 

print(0.1 + 0.2) # 0.30000000000000004

따라서 두수를 더한 0.3도 근사치로 표현되며 실제로는 위와같이 0.30000000000004와 같은 값이 됩니다.

 

그래서 0.1 + 0.2 의 값이 정확히 0.3 이 아니므로 print(0.1+0.2 == 0.3)은 False 가 됩니다.

 

 

 그렇다면 print( 3 / 10 == 0.3 ) 은 어떨까요?

 

왜 이건 True 일까요?

3과 10은 정수입니다. 그리고 이를 나눈 3/10의 결과는 부동소수점으로 나오며, 이는 0.3과 같습니다.

물론 이 결과는 0.3 이라는 실수를 컴퓨터가 표현할 수 있는 가장 가까운 부동소수점으로 근사된 값 입니다.

그래서 3 / 10 의 결과와 0.3이 정확히 같은지 비교하면, 실제로 두 값 모두 부동소수점으로 근사된 값이기에 "Ture"가 나옵니다.

 

 

Appendix

이를 파이썬에서 조금 다르게 처리할수도 있는데 math 라이브러리의 isclose 함수를 사용하는 것입니다.

isclose 함수는 두 값이 충분히 가까운지(즉, 차이가 매우 작은지)를 확인합니다.

 

 

 

 

728x90