bigint
СОДЕРЖАНИЕ
ИМЯ
bigint - поддержка больших целых чисел для Perl
СИНТАКСИС
use bigint;
$x = 2 + 4.5; # Math::BigInt 6
print 2 ** 512; # Math::BigInt 134...096
print inf + 42; # Math::BigInt inf
print NaN * 7; # Math::BigInt NaN
print hex("0x1234567890123490"); # Perl v5.10.0 or later
{
no bigint;
print 2 ** 256; # a normal Perl scalar now
}
# for older Perls, import into current package:
use bigint qw/hex oct/;
print hex("0x1234567890123490");
print oct("01234567890123490");
ОПИСАНИЕ
Все числовые литералы в заданном области видимости преобразуются в объекты Math::BigInt. Числовые литералы, представляющие не целые числа, усекаются до целого числа. Все результаты выражений также усекаются до целого числа.
Все операторы (включая основные математические операции), кроме оператора диапазона, перегружены.
В отличие от псевдонима integer, псевдоним bigint создаёт целые числа, ограниченные только доступной памятью.
Таким образом, следующее:
use bigint;
$x = 1234;
создаёт Math::BigInt и сохраняет ссылку на него в $x. Это происходит прозрачно и незаметно, так сказать.
Вы можете увидеть это следующим образом:
perl -Mbigint -le 'print ref(1234)'
Поскольку числа фактически являются объектами, вы можете вызывать все обычные методы из Math::BigFloat для них. Это даже работает до некоторой степени с выражениями:
perl -Mbigint -le '$x = 1234; print $x->bdec()'
perl -Mbigint -le 'print 1234->copy()->binc();'
perl -Mbigint -le 'print 1234->copy()->binc->badd(6);'
perl -Mbigint -le 'print +(1234)->copy()->binc()'
(Обратите внимание, что print не делает того, что вы ожидаете, если выражение начинается с '(' (из-за этого +)
Вы даже можете объединять операции как обычно:
perl -Mbigint -le 'print 1234->copy()->binc->badd(6);'
1241
Обратите внимание, что следующее не работает как ожидается (выводит ничего), так как перегрузка оператора '..' пока невозможна в Perl (по состоянию на v5.8.0):
perl -Mbigint -le 'for (1..2) { print ref($_); }'
использование integer по сравнению с использованием bigint
Существуют некоторые различия между use integer и use bigint.
В то время как use integer ограничено тем, что может быть обработано как Perl-скаляр, use bigint может обрабатывать произвольно большие целые числа.
Кроме того, use integer влияет на присваивания переменным и возвращаемое значение некоторых функций. use bigint усекает эти результаты до целого числа:
# perl -Minteger -wle 'print 3.2'
3.2
# perl -Minteger -wle 'print 3.2 + 0'
3
# perl -Mbigint -wle 'print 3.2'
3
# perl -Mbigint -wle 'print 3.2 + 0'
3
# perl -Mbigint -wle 'print exp(1) + 0'
2
# perl -Mbigint -wle 'print exp(1)'
2
# perl -Minteger -wle 'print exp(1)'
2.71828182845905
# perl -Minteger -wle 'print exp(1) + 0'
2
На практике это редко имеет значение для небольших целых чисел, поскольку части и результаты выражений усекаются в любом случае, но это может, например, повлиять на возвращаемое значение подпрограмм:
sub three_integer { use integer; return 3.2; }
sub three_bigint { use bigint; return 3.2; }
print three_integer(), " ", three_bigint(),"\n"; # prints "3.2 3"
Параметры
bigint распознает некоторые параметры, которые могут быть переданы во время загрузки через use. Существуют следующие параметры:
- a или точность
-
Это устанавливает точность для всех математических операций. Аргумент должен быть больше или равен нулю. Подробности см. в методе bround() Math::BigInt.
perl -Mbigint=a,2 -le 'print 12345+1'Обратите внимание, что одновременная установка точности и точности невозможна.
- p или точность
-
Это устанавливает точность для всех математических операций. Аргумент может быть любым целым числом. Отрицательные значения означают фиксированное число знаков после точки и игнорируются, поскольку все операции выполняются в целой части. Положительное значение округляет до этого разряда слева от точки. 0 означает округление до целого. Подробности см. в методе bfround() Math::BigInt.
perl -mbigint=p,5 -le 'print 123456789+123'Обратите внимание, что одновременная установка точности и точности невозможна.
- t или отслеживание
-
Это включает режим отслеживания и предназначено в основном для отладки.
- l, lib, try или только
-
Загрузка другой математической библиотеки, см. "Библиотека Math".
perl -Mbigint=l,GMP -e 'print 2 ** 512' perl -Mbigint=lib,GMP -e 'print 2 ** 512' perl -Mbigint=try,GMP -e 'print 2 ** 512' perl -Mbigint=only,GMP -e 'print 2 ** 512' - hex
-
Переопределите встроенный метод hex() версией, которая может обрабатывать большие числа. Это переопределяет его, экспортируя его в текущий пакет. В Perl v5.10.0 и выше это не так необходимо, так как hex() лексически переопределяется в текущей области видимости всякий раз, когда активен псевдоним
bigint. - oct
-
Переопределите встроенный метод oct() версией, которая может обрабатывать большие числа. Это переопределяет его, экспортируя его в текущий пакет. В Perl v5.10.0 и выше это не так необходимо, так как oct() лексически переопределяется в текущей области видимости всякий раз, когда активен псевдоним
bigint. - v или версия
-
выводит имя и версию модулей, а затем завершается.
perl -Mbigint=v
Библиотека Math
Математические операции с числами выполняются (по умолчанию) библиотекой модулей Math::BigInt::Calc. По умолчанию это эквивалентно:
use bigint lib => 'Calc';
вы можете изменить это, используя:
use bigint lib => 'GMP';
Следующее сначала попытается найти Math::BigInt::Foo, затем Math::BigInt::Bar, и если это также не удастся, вернётся к Math::BigInt::Calc:
use bigint lib => 'Foo,Math::BigInt::Bar';
Использование c<lib> выводит предупреждение, если ни одна из указанных библиотек не найдена, и Math::BigInt вернулся к одной из библиотек по умолчанию. Чтобы подавить это предупреждение, используйте c<try> вместо этого:
use bigint try => 'GMP';
Если вы хотите, чтобы код завершился аварийно вместо возврата к значениям по умолчанию, используйте only вместо этого:
use bigint only => 'GMP';
Дополнительные подробности см. в документации соответствующего модуля.
Вызовы методов
Поскольку все числа теперь являются объектами, вы можете использовать все методы, которые являются частью API Math::BigInt.
Но следует дать предупреждение. При использовании следующего для создания копии числа, будет создана только поверхностная копия.
$x = 9; $y = $x;
$x = $y = 7;
Использование копии или оригинала с перегруженной математикой работает, например, следующие примеры работают:
$x = 9; $y = $x;
print $x + 1, " ", $y,"\n"; # prints 10 9
но вызов любого метода, который изменяет число напрямую, приведёт к уничтожению оба оригинал и копия:
$x = 9; $y = $x;
print $x->badd(1), " ", $y,"\n"; # prints 10 10
$x = 9; $y = $x;
print $x->binc(1), " ", $y,"\n"; # prints 10 10
$x = 9; $y = $x;
print $x->bmul(2), " ", $y,"\n"; # prints 18 18
Использование методов, которые не изменяют, но проверяют содержимое, работает:
$x = 9; $y = $x;
$z = 9 if $x->is_zero(); # works fine
См. документацию по конструктору копии и = в перегрузке, а также документацию в Math::BigInt для получения дополнительных сведений.
Методы
- inf()
-
Сокращение для возврата Math::BigInt->binf(). Полезно, потому что Perl не всегда корректно обрабатывает ключевые слова
inf. - NaN()
-
Сокращение для возврата Math::BigInt->bnan(). Полезно, потому что Perl не всегда корректно обрабатывает ключевые слова
NaN. - e
-
# perl -Mbigint=e -wle 'print e'Возвращает число Эйлера
e, то есть exp(1). Обратите внимание, что вbigint, это усекается до целого числа, т.е. 2. - PI
-
# perl -Mbigint=PI -wle 'print PI'Возвращает PI. Обратите внимание, что в
bigint, это усекается до целого числа, т.е. 3. - bexp()
-
bexp($power, $accuracy);Возвращает число Эйлера
eв соответствующей степени, с желаемой точностью.Обратите внимание, что в
bigint, результат усекается до целого числа.Пример:
# perl -Mbigint=bexp -wle 'print bexp(1,80)' - bpi()
-
bpi($accuracy);Возвращает PI с желаемой точностью. Обратите внимание, что в
bigint, это усекается до целого числа, т.е. 3.Пример:
# perl -Mbigint=bpi -wle 'print bpi(80)' - accuracy()
-
Установить или получить точность.
- precision()
-
Установить или получить точность.
- round_mode()
-
Установить или получить режим округления.
- div_scale()
-
Установить или получить масштаб деления.
- in_effect()
-
use bigint; print "in effect\n" if bigint::in_effect; # true { no bigint; print "in effect\n" if bigint::in_effect; # false }Возвращает true или false, если
bigintактивен в текущей области видимости.Этот метод работает только в Perl v5.9.4 и выше.
ОГРАНИЧЕНИЯ
- Шестнадцатеричные, восьмеричные и двоичные числа с плавающей запятой
-
Perl (и этот модуль) принимает шестнадцатеричные, восьмеричные и двоичные числа с плавающей запятой, но используйте их с осторожностью в Perl-версиях до v5.32.0, поскольку в некоторых версиях Perl результат выводится неверно.
- Перегрузка операторов против перегрузки литералов
-
bigintработает путём перегрузки обработки целых и чисел с плавающей запятой, преобразуя их в объекты Math::BigInt.Это означает, что арифметические операции, включающие только строковые значения или строковые литералы, выполняются с помощью встроенных операторов Perl.
Например:
use bigint; my $x = "900000000000000009"; my $y = "900000000000000007"; print $x - $y;выводит
0в 32-битных системах по умолчанию, так какbigintникогда не видит строковые литералы. Чтобы гарантировать, что все выражения обрабатываются как объектыMath::BigInt, используйте числовой литерал в выражении:print +(0+$x) - $y; - Диапазоны
-
Perl не позволяет перегружать диапазоны, поэтому вы не можете безопасно использовать диапазоны с конечными точками
bigint, а также итератор не являетсяMath::BigInt.use 5.010; for my $i (12..13) { for my $j (20..21) { say $i ** $j; # produces a floating-point number, # not an object } } - in_effect()
-
Этот метод работает только в Perl v5.9.4 и выше.
- hex()/oct()
-
bigintпереопределяет эти функции версиями, которые также могут обрабатывать значения больших целых чисел. Однако в Perl до версии v5.9.4 это не произойдёт, если вы не попросите его явно с помощью двух тегов импорта "hex" и "oct" - и тогда это будет глобально и не может быть отключено внутри области видимости сno bigint.use bigint qw/hex oct/; print hex("0x1234567890123456"); { no bigint; print hex("0x1234567890123456"); }Второй вызов hex() выведет предупреждение о непереносимой константе.
Сравните это с:
use bigint; # will warn only under Perl older than v5.9.4 print hex("0x1234567890123456");
ПРИМЕРЫ
Некоторые интересные примеры командной строки, чтобы впечатлить аудиторию Python ;) Вы можете сравнить их с результатами при использовании -Mbigfloat или -Mbigrat:
perl -Mbigint -le 'print sqrt(33)'
perl -Mbigint -le 'print 2*255'
perl -Mbigint -le 'print 4.5+2*255'
perl -Mbigint -le 'print 123->is_odd()'
perl -Mbigint=l,GMP -le 'print 7 ** 7777'
ОШИБКИ
Пожалуйста, сообщайте о любых ошибках или предложениях по улучшению в bug-bignum at rt.cpan.org, или через веб-интерфейс по адресу https://rt.cpan.org/Ticket/Create.html?Queue=bignum (требуется вход). Мы будем оповещены, и затем вы автоматически будете оповещены о ходе выполнения вашей ошибки по мере внесения изменений.
ПОДДЕРЖКА
Вы можете найти документацию к этому модулю с помощью команды perldoc.
perldoc bigint
Вы также можете поискать информацию по:
-
GitHub
-
RT: Справочник по запросам CPAN
-
MetaCPAN
-
Матрица тестеров CPAN
-
Рейтинги CPAN
ЛИЦЕНЗИЯ
Эта программа является свободной программой; вы можете перераспределять её и/или изменять её на тех же условиях, что и Perl.
СМОТРИТЕ ТАКЖЕ
Math::BigInt, Math::BigFloat, Math::BigRat и Math::Big, а также Math::BigInt::FastCalc, Math::BigInt::Pari и Math::BigInt::GMP.
АВТОРЫ
-
(C) Телс http://bloodgate.com/ в начале 2002 - 2007 гг.
-
Поддерживается Питером Джоном Эккламом <pjacklam@gmail.com>, 2014 -.
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/bigint