PS/자주 하는 답변

float는 너무나 부정확합니다.

djm03178 2023. 1. 4. 12:24

 

 

게임 개발 등 실무 프로그래밍에서는 부동소수점 자료형으로 float (4바이트 부동소수점 자료형)를 쓰는 일이 많습니다. 많은 경우 float는 적당히 쓸만한 정확도를 보여주고, 자료형의 크기가 작아 속도가 빠르기 때문에 자주 쓰이는 편입니다. 하지만, PS에서는 절대 float를 권장하지 않습니다.

 

이유는 간단합니다. PS 문제들은 칼같은 정확도를 요구하기 때문입니다. 대부분의 문제에서는 조금의 오차도 허용하지 않으며, 오차를 허용하는 문제에서도 그 오차가 매우 작을 것을 요구하는 것이 PS 문제입니다. 실수형을 써야 하는 문제에서 많은 경우 "절대/상대 오차는 $10^{-9}$까지 허용한다."와 같이 극도로 작은 오차만을 허용하는데, $10^{-9}$라는 것은 적어도 유효숫자 9자리가 정확해야 한다는 것을 의미합니다.

 

반면에 float라는 자료형은 정확성을 유효숫자 겨우 6개 정도밖에 보장하지 않는 매우 부정확한 자료형입니다. 바이트 수를 조금 아끼겠다고, 시간을 조금 단축하겠다고 엄청난 정확도를 희생해가면서까지 float를 쓸 이유가 웬만해서는 없습니다. 어떤 문제든 실수 자료형을 안 쓸 수 있다면 안 쓰는 것이 우선, 꼭 써야만 한다면 long double, 하다못해 최소 double 이상은 쓰도록 습관을 들이는 것이 좋습니다.

 

https://ideone.com/NJ0M7y 의 출력 결과를 확인해 보면, 왜 문제 풀이에서 float를 써서는 안 되는지 대충 감이 올 거라고 생각합니다.

 

+ Python의 경우 기본 실수 자료형이 float 하나뿐인데 여기서의 float는 C/C++의 double과 같은 정확도를 가지므로 그냥 사용하면 됩니다. 보다 높은 정확도가 필요할 때에는 decimal.Decimal을 사용하면 됩니다. 물론, 여기에서도 실수형 자체를 안 쓰는 것이 우선입니다. 특히, (int) / (int)와 같은 연산은 하는 순간 그 즉시 float형이 되면서 곧바로 오차가 발생할 수 있기 때문에 (int(a/b)도 오차가 발생합니다!!!), 몫만 있으면 되고 소수점 아래가 필요한 상황이 아니면 // 연산자를 통해 나누어주는 것이 좋습니다.

더 보기

 

부동소수점에 대한 이해 2

서론 지난 글에서는 부동소수점 자료형이 무엇이고, 이들의 대표적인 표준인 IEEE 754에서 규정한 이진법 16비트 자료형의 세부적인 구조 및 10진수와 서로 변환하는 법 등을 알아보았습니다. 이번

infossm.github.io

 

부동소수점 자료형에 대한 이해 1

서론 많은 프로그래밍 언어들에서 우리는 부동소수점 자료형을 사용하게 됩니다. 대표적으로 C, C++의 float와 double, 그리고 long double이 있습니다. 이러한 자료형들을 사용할 때에는 항상 듣는 주

infossm.github.io