printf는 반을 어떻게 첫 번째 소수점으로 반올림합니까?


11

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반올림 은 어떻게 소수점 첫째 자리까지 반 올립니까?

답변:


19

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

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


1
x.25와 x.75 (적절하게 작은 x의 경우)는 다른 것과 달리 정확한 이진 표현을가집니다.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.