장면이 있어요
다음 두 명령을 사용하여 특정 열의 합계를 계산합니다.
이 명령이 실제로 수행하는 작업을 자세히 설명할 수 있는 사람이 있나요?
첫 번째 명령어 [특정 컬럼의 합을 계산할 때 사용하는 경우]
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
.
이 웹 사이트는 근본적인 문제를 설명합니다.
모든 프로그래머가 부동 소수점 연산에 대해 알아야 할 사항