이 두 sum 명령 사이에 차이점이 있는 이유는 무엇입니까?

이 두 sum 명령 사이에 차이점이 있는 이유는 무엇입니까?

시나리오가 있어요

여기서 아래 두 명령을 사용하여 특정 열의 합계를 계산하고 있습니다.

명령이 실제로 수행하는 작업을 자세히 설명해 줄 수 있는 사람이 있나요?

첫 번째 명령 [특정 열의 합을 계산할 때 사용하는 경우]

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이진 부동 소수점 숫자를 사용하여 정확하게 표현할 수 없으며 부동 소수점 숫자의 제한된 정밀도는 연산 순서나 중간 저장 장치의 정밀도가 약간 변경되면 결과가 변경될 수 있음을 의미합니다. 설상가상으로 임의 정밀도 부동 소수점 연산을 사용하면 계산을 시작하기 전에 정밀도를 설정할 수 있지만 최종 결과에서 유효 소수 자릿수를 확신할 수 없습니다.

gawkGNU 입니다 awk. 지원합니다-M:

-M
--bignum

숫자에 대한 임의 정밀도 연산을 선택합니다. 이 옵션은 gawkGNU 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더 나은 결과를 얻으려면 늘리세요 .

근본적인 문제는 이 사이트에 설명되어 있습니다:
모든 프로그래머가 부동 소수점 산술에 대해 알아야 할 사항

관련 정보