Spec-Zone.ru › Perl 5.38

bigint

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
    • использование integer по сравнению с использованием bigint
    • Параметры
    • Библиотека Math
    • Вызовы методов
    • Методы
  • ОСОБЕННОСТИ
  • ПРИМЕРЫ
  • ОШИБКИ
  • ПОДДЕРЖКА
  • ЛИЦЕНЗИЯ
  • СМОТРИТЕ ТАКЖЕ
  • АВТОРЫ

ИМЯ

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 или only

Загрузить другую библиотеку Math, см. "Библиотека 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

См. документацию о конструкторе копии и = в overload, а также документацию в 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

    https://github.com/pjacklam/p5-bignum

  • RT: Справочник по запросам CPAN

    https://rt.cpan.org/Dist/Display.html?Name=bignum

  • MetaCPAN

    https://metacpan.org/release/bignum

  • Матрица тестировщиков CPAN

    http://matrix.cpantesters.org/?dist=bignum

  • Рейтинги CPAN

    https://cpanratings.perl.org/dist/bignum

ЛИЦЕНЗИЯ

Эта программа — свободное программное обеспечение; вы можете перераспределять её и/или изменять её на тех же условиях, что и Perl сам по себе.

СМОТРИТЕ ТАКЖЕ

bignum и bigrat.

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–2023 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.38.0/bigint

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API