[Python] 부동소수점

2024. 5. 15. 13:25프로그래밍 언어/Python

컴퓨터가 실수를 표현하는 방법은 크게 두 가지가 있습니다.

 

1. 고정소수점( fixed point )

만약 4 byte 로 실수를 표현한다면 16bit를 정수, 나머지 16bit를 소수로 표현하자! 라고 정수 부분과 소수점 이하부분을 표현하는 bit 수를 고정시킬 수 있습니다. 

 

10/3 인경우 예를 보면

소수가 계속 반복되는데, 이를 16bit이기 때문에 마지막에 반올림이 일어난다.정수부분의 bit를 늘리면 큰 수를 표현할 수 있는 대신 정밀한 값은 표현하기 어렵고, 반대인 경우는 정밀한 대신 큰 수를 표현하기 어렵습니다.

 

이를 해결하기 위해 나온 것이 부동소수점입니다.

2. 부동소수점( floating point )

IEEE의 규격에 따라 위의 방식대로 실수를 표현한다. 

 

3. 문제 해결

알고리즘 문제풀이 중에 1000000000999999999 을 1로 나누면 10000000001000000000 이되는 문제가 있었습니다.

정수형을 1로 나누는 순간 실수형이 됩니다. 그럼 부동소수점 방식으로 값을 저장하는데, 이 과정에서 

1.000000000999999999 x 10^18 이 되고 이렇게 실수부가 깊어질수록 값을 정확하게 표현하기 어렵기 때문입니다. 실수부를 계산하다가 bit가 부족하여 더이상 정확한 계산이 어려우면 반올림하기 때문입니다.

해결하려면 1000000000999999999 // 1을 해주면 됩니다.