awk 산술은 expr과 다릅니다

awk 산술은 expr과 다릅니다

awk 산술과 expr 사이에는 대조되는 출력이 있습니다.

expr 11111111111111111111 / 22

주어진

505050505050505050

그러나 awk의 경우:

echo '11111111111111111111' | awk '{q=$1/22;;print q}'

주어진

505050505050505024

누군가 이것을 설명할 수 있나요?

답변1

아마도 당신의 awk작업은 GNU awk처럼 부동 소수점 값을 사용하여 작동할 것입니다.

$ gawk 'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111110656 505050505050505024

정확하게 저장할 수도 없고 11111111111111111111나머지( 11111111111111111111 / 22is 505050505050505029.81...)도 정확하게 저장할 수 없습니다.

숫자의 범위 가 expr더 넓은 것 같습니다. 내 것은 그렇지 않습니다 (GNU coreutils 8.26의 것):

$ expr 11111111111111111111 / 22
expr: 11111111111111111111: Numerical result out of range

~처럼@스틸드라이버댓글, 현재 버전GNU awk는 또한 다음을 수행할 수 있습니다.사용GNU MPFR 라이브러리고정밀 연산에 사용됩니다. 예를 들어, 4배 정밀도 부동 소수점 수는 다음 나눗셈에 대한 정확한 답변을 제공하는 데 충분합니다.

$ gawk -M -v PREC="quad" -v OFMT="%.6f" \
  'BEGIN{ a = 11111111111111111111; print a, a/22; }'
11111111111111111111 505050505050505050.500000

그 외에도 bcPython은 임의의 큰 숫자와 함께 사용할 수 있습니다.

관련 정보