То, что вы видите в своем ответе от awk, в основном является шумом.
Мы можем сравнить числа с bc
небольшой утилитой (около 80 КБ), предназначенной для вычислений с произвольной точностью:
$ calc(){ awk "BEGIN{print $*}"; }
$ math='56777654409823*4674990588446667952594759939814064128'
$ bc <<<"$math"; calc "$math"
265434999999999978394292482412066060207814915129344
265434999999999985120999032855606532558652107128832
265434999999999978394292482412066060207814915129344
2654349999999999 85120999032855606532558652107128832
Обратите внимание, что совпадают только первые ~16 десятичных цифр, что является точностью двойной точности (64 бита) математики с плавающей запятой.
Да, gawk может выполнять математические вычисления с произвольной точностью, но только если они скомпилированы в программу и программа вызывается с опцией -M .
Убедитесь, что --version содержит «GNU MPFR и GNU MP».
гавк --версия
-| GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
-| Copyright (C) 1989, 1991-2015 Фонд свободного программного обеспечения.
вызвать gawk с опцией -M
.
Прочтите 15.5 Целочисленная арифметика произвольной точности с помощью gawk.
Вы должны вызывать gawk как:
calc(){ awk -M "BEGIN{print $*}"; }
Вместо того, чтобы проверять несколько деталей с помощью awk или gawk, используйте:
bc — это утилита, используемая для выполнения математических операций с произвольной точностью:
bc <<<'56777654409823*4674990588446667952594759939814064128'
265434999999999978394292482412066060207814915129344
Вычислите пи до 200 цифр (в 4 раза больше арктангенса 1):
$ 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