나는 종종 awk(gawk) 계산기를 사용합니다.
calc(){ awk "BEGIN{ print $* }" ;}
Ubuntu 14.04에서는 표준 형식으로 큰 숫자를 출력합니다.
$ calc 56777654409823*4674990588446667952594759939814064128
2.65435e+50
그러나 이제(Ubuntu 15.10) 출력은 더 이상 표준 형식이 아닙니다.
$ calc 56777654409823*4674990588446667952594759939814064128
265434999999999985120999032855606532558652107128832
무엇이 바뀌었나요? 출력이 표준 형식인지 여부를 선택할 수 있는 방법이 있습니까?
답변1
대신 printf를 사용하세요.
calc(){ awk "BEGIN{ printf (\"%.5e\\n\", $*) }" ;}
답변2
awk의 답변에서 볼 수 있는 대부분은 소음입니다.
bc
이 숫자를 임의 정밀도 계산을 수행하도록 설계된 작은 유틸리티(약 80kByte)와 비교할 수 있습니다 .
$ calc(){ awk "BEGIN{print $*}"; }
$ math='56777654409823*4674990588446667952594759939814064128'
$ bc <<<"$math"; calc "$math"
265434999999999978394292482412066060207814915129344
265434999999999985120999032855606532558652107128832
2654349999999999978394292482412066060207814915129344
265434999999999985120999032855606532558652107128832
유일하게 일치하는 숫자는 배정밀도(64비트) 부동 소수점 연산의 정밀도인 처음 16개의 십진수입니다.
예, gawk는 임의의 정밀 수학 연산을 수행할 수 있습니다.컴파일된프로그램 입력그리고프로그램 이름은그들을 따라가옵션.
--version에 "GNU MPFR 및 GNU MP"가 포함되어 있는지 확인하세요.
gawk --version -| GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2) -| Copyright (C) 1989, 1991-2015 Free Software Foundation.
이 옵션을 사용하여 gawk를 호출하세요
-M
.
gawk에게 전화해야 합니다.
calc(){ awk -M "BEGIN{print $*}"; }
여러 세부 정보를 확인하기 위해 awk 또는 gawk를 사용하는 대신 다음을 사용하세요.
BC 사용
bc는 임의의 정밀도로 수학적 계산을 수행하는 유틸리티입니다.
bc <<<'56777654409823*4674990588446667952594759939814064128'
265434999999999978394292482412066060207814915129344
파이를 200자리(1의 아크 탄젠트의 4배)로 계산합니다.
$ bc <<<"scale=200;4*a(1)"
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
223172535940812848111745028410270193852110555964462294895493038196
실제 계산을 사용하십시오:
함수를 정의한 후 다음을 작성하면 다음 목록이 표시됩니다.
$ type -a calc
calc is a function
calc () { awk -M "BEGIN{print $*}"; }
calc is /usr/bin/calc
함수 정의를 해제하면 됩니다.
$ unset -f calc
$ type calc
calc is /usr/bin/calc
거기서 당신은 할 수 있습니다:
$ calc '2* 3'
6
$ calc '2 ^ 127 - 1' # mersene prime.
170141183460469231731687303715884105727
$ calc '56777654409823*4674990588446667952594759939814064128'
265434999999999978394292482412066060207814915129344
이것은 bc의 답변과 정확히 동일합니다.
$ math='56777654409823*4674990588446667952594759939814064128'
$ bc <<<"$math"; echo $(calc "$math")
265434999999999978394292482412066060207814915129344
265434999999999978394292482412066060207814915129344