뭐 0.1 이런거 2진수로 표현하면 무한히 이어지기 때문에 부동소수점으로 근사값을 반환하고
그러다보니까 0.1 + 0.2 이런거 하면 0.3 같이 정확한 값이 안 나온다는 사실은 알고 있거든
그러면 정수랑 부동소수점 연산 예를 들어 1234 / 10.0 이나 1234 / 2.0 이런 연산들도 결과 값이 부정확할 수 있다는 거자나?
근데 아직까지 나는 정수를 2.0로 나누는거나 10.0으로 나누는거는 결과값이 다르게 나온적은 없거든?
위의 예시같은거나 혹은 다른 정수, 부동소수점 연산에서 부정확한 결과값이 나올 수 있는거야?
예시
https://ideone.com/j5lHw2
2진법에거 2.0으로 나누는건 정확하지 10진법에서 10으로 나누는거랑 같은데
1234 / 2.0 이 어떻게 저장되나 비트 단위로 확인해봤는데 이상해. IEEE 754랑 포맷이 달라. 내가 잘못한 걸지도 모름.
https://godbolt.org/z/vTEPa6YY7
버그 2개 있는데 std::views::iota(0, N)이 0, 1, 2, ..., N-1이라 템플릿에 N-1 대신 N으로 지정해야 하고, is_bit_set에서 1 << n 결과 type이 int가 되고있는데 상수 1을 1L로 지정해서 long으로 지정해줘야 함. 버그 고치니 IEEE754대로 잘 나온다.
아 템플릿 얘기는 N = (sizeof(I) << 3) - 1 대신 N = (sizeof(I) << 3)으로 하란 소리.
ㄳㄳ bitset으로 했더니 잘 되긴 함. 결론은 1234 / 2.0 은 정확히 저장되고 1234 / 10.0 은 아님
https://godbolt.org/z/h65zYT97c
그래서 원래 float/double 자료형은 ==로 비교하면 안됨. 각 언어마다 대소비교로 근사치가 맞는지 아닌지 판단하기 위한 constant를 제공함