printf는 반을 어떻게 첫 번째 소수점으로 반올림합니까? 버전 . 반 숫자가 반올림되는

printf내 시스템에서 두 가지 다른 구현을 테스트 printf (GNU coreutils) 8.26하고 zsh 5.3.1있습니다. 및와 번들로 제공되는 버전 . 반 숫자가 반올림되는 방법, 즉 1.5, 2.5, 3.5,… 9.5를 테스트하고 있습니다.

$ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
$ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10

여기서 모두 반으로 짝수로 반올림 합니다. 그러나 첫 번째 소수점으로 반올림을 테스트하면 상황이 혼란스러워집니다. 즉, 1.15, 1.25, 1.35,… 1.95 테스트 중입니다.

$ for i in {1..9}; do /usr/bin/printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.5
1.5
1.6
1.8
1.9
2.0
$ for i in {1..9}; do printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.4
1.6
1.6
1.8
1.9
1.9

두 구현 모두 다르게 수행하며 명확한 패턴을 볼 수 없습니다. 이 두 printf반올림 은 어떻게 소수점 첫째 자리까지 반 올립니까?



답변

GNU printf long double zsh 는 regular doubles를 사용 하지만 사용합니다 . 반올림 동작은 1.45를 2의 거듭 제곱으로 표현할 수 없기 때문에 IEEE 754 부동 소수점 표현이 작동 하는 방식이며 가장 가까운 근사는 정밀도에 따라 달라집니다. 약간 더 많거나 (80 비트가 있음) (64 비트가 있음) 보듯이 반올림 또는 내림합니다.

예를 들어 정확한 인간 수준 표현과 반올림에 관심이 있다면 부동 소수점을 사용하지 마십시오.


답변