Вычесть большое число в баш - PullRequest
0 голосов
/ 17 января 2019

Хочу сделать саб с двумя большими числами

моя цель

1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480

Я пытаюсь с

echo $((1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480))

Мой результат: 3160661815551241129

но это не правильно.

Я могу сделать аналогичную операцию в консоли Chrome и у меня есть

-1.5642404591095965e+

Как я могу сделать эту операцию в bash? Я пробовал даже с expr, но без везения

Можно проверить, больше ли число, чем другое

в оболочке

echo $((1805334111369276485744644020321551471447190030955050085289>3369574570478873127315415525946742317481702644901195284480))

результат: 1

та же операция в хроме

1805334111369276485744644020321551471447190030955050085289>3369574570478873127315415525946742317481702644901195284480

Результат: ложь

А хром правильный

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Mac OSX awk также может обрабатывать большие числа:

awk 'BEGIN{print 1805334111369276485744644020321551471447190030955050085289 - \
3369574570478873127315415525946742317481702644901195284480}'

-1.56424045910959651912822682029e+57

Или с помощью printf:

awk 'BEGIN{printf "%.5e\n", 1805334111369276485744644020321551471447190030955050085289 - \
3369574570478873127315415525946742317481702644901195284480}'

-1.56424e+57

С другой стороны GNU awk требуется -M переключатель для поддержки больших чисел, поэтому используйте:

gawk -M 'BEGIN{print 1805334111369276485744644020321551471447190030955050085289 - \
3369574570478873127315415525946742317481702644901195284480}'
0 голосов
/ 17 января 2019

Вы можете использовать Perl

$ perl -le ' BEGIN { use Math::BigInt; my $x=Math::BigInt->new("1805334111369276485744644020321551471447190030955050085289"); my $y=Math::BigInt->new("3369574570478873127315415525946742317481702644901195284480"); print $x->bsub($y) } '
-1564240459109596641570771505625190846034512613946145199191
$ perl -le ' BEGIN { use Math::BigInt; my $x=Math::BigInt->new("1805334111369276485744644020321551471447190030955050085289"); my $y=Math::BigInt->new("3369574570478873127315415525946742317481702644901195284480"); printf("%g\n",$x->bsub($y)) } '
-1.56424e+57
$

Если вы хотите передать эхо-вывод в Perl, тогда

$ echo "1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480" | perl -ne ' BEGIN { use Math::BigInt } /(\d+)-(\d+)/; $x=Math::BigInt->new($1); $y=Math::BigInt->new($2); printf("%g\n",$x->bsub($y)) '
-1.56424e+57
$

В качестве @Pesa упомянутого вы можете использовать bc также

$ bc <<< "1805334111369276485744644020321551471447190030955050085289-3369574570478873127315415525946742317481702644901195284480"
-1564240459109596641570771505625190846034512613946145199191
$
0 голосов
/ 17 января 2019

Если вы любите приключения, вы можете использовать старый добрый dc (настольный калькулятор, симпатичный калькулятор RPN):

dc <<< "1805334111369276485744644020321551471447190030955050085289 3369574570478873127315415525946742317481702644901195284480 - p"

Ответ: -1564240459109596641570771505625190846034512613946145199191

0 голосов
/ 17 января 2019

В разделе ARITHMETIC EVALUATION руководства bash объясняется, почему вы получаете этот результат с $((...)):

Оценка выполняется в целых числах фиксированной ширины без проверки переполнения

Вы можете использовать expr (в зависимости от параметров времени компиляции, проверьте комментарий @ Benjamin W ), но между оператором и его операндами должны быть пробелы:

$ expr 1805334111369276485744644020321551471447190030955050085289 - 3369574570478873127315415525946742317481702644901195284480
-1564240459109596641570771505625190846034512613946145199191

Как @ PesaThe упоминает, что вы также можете использовать bc, одна из его основных функций, способная обрабатывать произвольную точность арифметики:

bc <<< "1805334111369276485744644020321551471447190030955050085289 - 3369574570478873127315415525946742317481702644901195284480"
-1564240459109596641570771505625190846034512613946145199191
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...