시나리오가 있어요
여기서 아래 두 명령을 사용하여 특정 열의 합계를 계산하고 있습니다.
명령이 실제로 수행하는 작업을 자세히 설명해 줄 수 있는 사람이 있나요?
첫 번째 명령 [특정 열의 합을 계산할 때 사용하는 경우]
awk -F '"?\\|"?' '{T+=$(2)*1000} END {printf "%.2f\n",T/1000}' demofile.txt
두 번째 명령 [특정 열의 합을 계산할 때 사용]
awk -F '"?\\|"?' '{T+=$(2)} END {printf "%.2f\n",T}' demofile.txt
두 명령을 사용하여 계산된 합계가 다른 경우. 왜 그래야만하지 ?
출력은 다음과 같습니다. 이것은 계산에 사용되는 파일입니다. [다운로드 및 테스트하십시오] (운영자가 링크를 제거했습니다. 보안상의 문제일 수 있음)
답변1
차이점은 무엇 때문인가?gawk
수동상태:
이진 부동 소수점 표현과 산술은 정확하지 않습니다. 와 같은 간단한 값은
0.1
이진 부동 소수점 숫자를 사용하여 정확하게 표현할 수 없으며 부동 소수점 숫자의 제한된 정밀도는 연산 순서나 중간 저장 장치의 정밀도가 약간 변경되면 결과가 변경될 수 있음을 의미합니다. 설상가상으로 임의 정밀도 부동 소수점 연산을 사용하면 계산을 시작하기 전에 정밀도를 설정할 수 있지만 최종 결과에서 유효 소수 자릿수를 확신할 수 없습니다.
gawk
GNU 입니다 awk
. 지원합니다-M
:
-M --bignum
숫자에 대한 임의 정밀도 연산을 선택합니다. 이 옵션은
gawk
GNU MPFR 및 MP 라이브러리를 사용하도록 컴파일되지 않은 경우 아무런 효과가 없습니다 .
귀하는 awk
와 동등할 수도 있고 그렇지 않을 수도 있습니다 gawk
. 내 Debian 9에서는 다음 두 명령이 각각 다음을 생성합니다 25396577843.76
.
LC_NUMERIC=C gawk -M -v PREC=60 -F '"?\\|"?' '{T+=$(2)*1000} END {printf "%.2f\n",T/1000}' demofile.txt
LC_NUMERIC=C gawk -M -v PREC=60 -F '"?\\|"?' '{T+=$(2)} END {printf "%.2f\n",T}' demofile.txt
나는 printf "%.4f\n",T
여전히 차이점을 볼 수 있습니다. PREC
더 나은 결과를 얻으려면 늘리세요 .
근본적인 문제는 이 사이트에 설명되어 있습니다:
모든 프로그래머가 부동 소수점 산술에 대해 알아야 할 사항