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

gawk그것은 GNU입니다 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.

이 웹 사이트는 근본적인 문제를 설명합니다.
모든 프로그래머가 부동 소수점 연산에 대해 알아야 할 사항

관련 정보