Spec-Zone.ru › Perl 5.28

bigint

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТЕКС
  • ОПИСАНИЕ
    • использование integer против использования bigint
    • Параметры
    • Библиотека математических функций
    • Внутренний формат
    • Знак
    • Вызовы методов
    • Методы
  • ОСОБЕННОСТИ
  • ИСПОЛЬЗУЕМЫЕ МОДУЛИ
  • ПРИМЕРЫ
  • ОШИБКИ
  • ПОДДЕРЖКА
  • ЛИЦЕНЗИЯ
  • СМОТРИТЕ ТАКЖЕ
  • АВТОРЫ

ИМЯ

bigint - Поддержка BigInteger для Perl с прозрачным использованием

СИНТЕКС

use bigint;

$x = 2 + 4.5,"\n";                    # BigInt 6
print 2 ** 512,"\n";                  # really is what you think it is
print inf + 42,"\n";                  # inf
print NaN * 7,"\n";                   # NaN
print hex("0x1234567890123490"),"\n"; # Perl v5.10.0 or later

{
  no bigint;
  print 2 ** 256,"\n";                # a normal Perl scalar now
}

# Import into current package:
use bigint qw/hex oct/;
print hex("0x1234567890123490"),"\n";
print oct("01234567890123490"),"\n";

ОПИСАНИЕ

Все операторы (включая основные математические операции), кроме оператора диапазона, перегружены. Целочисленные константы создаются как полноценные BigInts.

Константы с плавающей точкой усекаются до целого. Все части и результаты выражений также усекаются.

В отличие от integer, эта псевдодиректива создает целые константы, ограниченные только доступной памятью и временем работы ЦП.

использование integer против использования bigint

Существует небольшое различие между use integer и use bigint: первое не повлияет на присваивания переменным и возвращаемое значение некоторых функций. 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 или accuracy

Это устанавливает точность для всех математических операций. Аргумент должен быть больше или равен нулю. Подробнее см. функцию bround() в Math::BigInt.

perl -Mbigint=a,2 -le 'print 12345+1'

Обратите внимание, что одновременная установка точности и значения accuracy невозможна.

p или precision

Это устанавливает точность для всех математических операций. Аргумент может быть любым целым числом. Отрицательные значения означают фиксированное количество цифр после точки, и они игнорируются, поскольку все операции выполняются в целочисленном пространстве. Положительное значение округляет до этой цифры слева от точки. 0 или 1 означают округление до целого и игнорируются, как и отрицательные значения.

Подробнее см. функцию bfround() в Math::BigInt.

perl -Mbignum=p,5 -le 'print 123456789+123'

Обратите внимание, что одновременная установка точности и значения accuracy невозможна.

t или trace

Это включает режим отслеживания и используется в основном для отладки bigint или Math::BigInt.

hex

Переопределите встроенный метод hex() версией, которая может обрабатывать большие целые числа. Это переопределяет его, экспортируя его в текущий пакет. В Perl v5.10.0 и выше это не так необходимо, так как hex() лексически переопределяется в текущем пространстве имен всякий раз, когда активна псевдодиректива bigint.

oct

Переопределите встроенный метод oct() версией, которая может обрабатывать большие целые числа. Это переопределяет его, экспортируя его в текущий пакет. В Perl v5.10.0 и выше это не так необходимо, так как oct() лексически переопределяется в текущем пространстве имен всякий раз, когда активна псевдодиректива bigint.

l, lib, try или only

Загрузить другую библиотеку математических функций, см. "Библиотека математических функций".

perl -Mbigint=lib,GMP -e 'print 2 ** 512'
perl -Mbigint=try,GMP -e 'print 2 ** 512'
perl -Mbigint=only,GMP -e 'print 2 ** 512'

В настоящее время нет способа указать более одной библиотеки в командной строке. Это означает, что следующее не работает:

perl -Mbignum=l,GMP,Pari -e 'print 2 ** 512'

Надеюсь, это будет исправлено в ближайшее время ;)

v или version

Это выводит имя и версию всех используемых модулей, а затем завершает работу.

perl -Mbigint=v

Библиотека математических функций

Математические вычисления с числами выполняются (по умолчанию) с помощью модуля Math::BigInt::Calc. Это эквивалентно следующему:

use bigint lib => 'Calc';

Вы можете изменить это, используя:

use bignum lib => 'GMP';

Следующее сначала попытается найти Math::BigInt::Foo, затем Math::BigInt::Bar, а когда это также не удастся, вернётся к Math::BigInt::Calc:

use bigint lib => 'Foo,Math::BigInt::Bar';

Использование lib выведет предупреждение, если ни одна из указанных библиотек не найдена, и Math::BigInt вернулся к одной из стандартных библиотек. Чтобы подавить это предупреждение, используйте try вместо этого:

use bignum try => 'GMP';

Если вы хотите, чтобы код завершался ошибкой вместо возврата к стандартным библиотекам, используйте only вместо этого:

use bignum only => 'GMP';

Дополнительные сведения см. в документации соответствующего модуля.

Внутренний формат

Числа хранятся в виде объектов, и их внутреннее представление может изменяться в любое время, особенно между математическими операциями. Объекты также могут принадлежать к различным классам, например, Math::BigInt или Math::BigInt::Lite. Смешивание их вместе, даже с обычными скалярами, является нормальным и ожидаемым поведением.

Вы не должны полагаться на внутренний формат; все обращения должны выполняться через методы доступа. Например, просмотр $x->{sign} — плохая идея, поскольку нет гарантии, что у объекта есть такой ключ в хэше, или что хэш присутствует вообще.

Знак

Знак может быть '+', '-', 'NaN', '+inf' или '-inf'. Вы можете получить доступ к нему с помощью метода sign().

Значение 'NaN' используется для представления результата, когда входные аргументы не являются числами, или в результате вычисления 0/0. '+inf' и '-inf' представляют соответственно плюс и минус бесконечность. Вы получите '+inf', когда разделите положительное число на 0, и '-inf', когда разделите любое отрицательное число на 0.

Вызовы методов

Поскольку все числа теперь являются объектами, вы можете использовать все функции, которые являются частью API BigInt. Вы можете использовать только обозначение bxxx(), а не fxxx().

Однако следует обратить внимание. При использовании следующего для создания копии числа будет создана только поверхностная копия.

$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

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

Возвращает π. Обратите внимание, что в bigint это усекается до целого числа и, следовательно, равно просто '3'.

bexp()
bexp($power,$accuracy);

Возвращает число Эйлера e, возведенное в соответствующую степень, с заданной точностью.

Обратите внимание, что в bigint результат усекается до целого числа.

Пример:

# perl -Mbigint=bexp -wle 'print bexp(1,80)'
bpi()
bpi($accuracy);

Возвращает π с заданной точностью. Обратите внимание, что в bigint это усекается до целого числа и, следовательно, равно просто '3'.

Пример:

# perl -Mbigint=bpi -wle 'print bpi(80)'
upgrade()

Возвращает класс, к которому числа повышаются. В действительности возвращает $Math::BigInt::upgrade.

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 и более поздних версиях.

ОСОБЕННОСТИ

Оператор против перегрузки литералов

bigint работает путем перегрузки обработки целочисленных и числовых литералов с плавающей точкой, преобразуя их в объекты Math::BigInt.

Это означает, что арифметические операции, включающие только строковые значения или строковые литералы, будут выполняться с помощью встроенных операторов Perl.

Например:

use bignum;
my $x = "900000000000000009";
my $y = "900000000000000007";
print $x - $y;

выведет 0 в системах с 32-битными сборками по умолчанию, так как bigint никогда не видит строковые литералы. Чтобы убедиться, что все выражения обрабатываются как объекты Math::BigInt, используйте целочисленный литерал в выражении:

print +(0+$x) - $y;
диапазоны

Perl не позволяет перегрузку диапазонов, поэтому вы не можете безопасно использовать диапазоны с конечными точками bigint, и переменная-итератор не будет bigint.

use 5.010;
for my $i (12..13) {
  for my $j (20..21) {
    say $i ** $j;  # produces a floating-point number,
                   # not a big integer
  }
}
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");

ИСПОЛЬЗУЕМЫЕ МОДУЛИ

bigint — это просто тонкая оболочка вокруг различных модулей семейства Math::BigInt. Представьте его как главу семьи, которая управляет магазином и заставляет других делать работу.

В настоящее время модуль bigint использует следующие модули:

Math::BigInt::Lite      (for speed, and only if it is loadable)
Math::BigInt

ПРИМЕРЫ

Некоторые интересные примеры командной строки, чтобы впечатлить поклонников Python ;) Вы можете сравнить результаты с результатами при использовании -Mbignum или -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 3/7 + 5/7 + 8/3'
perl -Mbigint -le 'print 123->is_odd()'
perl -Mbigint -le 'print log(2)'
perl -Mbigint -le 'print 2 ** 0.5'
perl -Mbigint=a,65 -le 'print 2 ** 0.2'
perl -Mbignum=a,65,l,GMP -le 'print 7 ** 7777'

ОШИБКИ

Информация об ошибках и способах их сообщения представлена в разделе BUGS в документации, доступной с помощью команды perldoc.

perldoc bignum

ПОДДЕРЖКА

Вы можете найти документацию по этому модулю с помощью команды perldoc.

perldoc bigint

Для получения дополнительной информации см. раздел SUPPORT в документации, доступной с помощью команды perldoc.

perldoc 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<gt>, 2014—.

© 1993–2020 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.28.3/bigint

Spec-Zone.ru

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