Spec-Zone.ru › Perl 5.30

bigint

СОДЕРЖАНИЕ

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

ИМЯ

bigint - Поддержка прозрачных чисел произвольной точности для 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, эта директива создает целочисленные константы, ограниченные только доступной памятью и временем процессора.

использование целых чисел против использования 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'

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

p или precision

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

См. функцию bfround() Math::BigInt для подробностей.

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

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

t или trace

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

hex

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

oct

Переопределяет встроенный метод oct() версией, которая может обрабатывать большие целые числа. Это переопределяет его, экспортируя его в текущий пакет. В Perl версии 5.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

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

hex()/oct()

bigint переопределяет эти функции версиями, которые также могут обрабатывать большие целые числа. Однако в Perl до версии 5.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

Для получения дополнительной информации см. раздел ПОДДЕРЖКА в документации, доступной с помощью команды perldoc.

perldoc bignum

ЛИЦЕНЗИЯ

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

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

bignum и bigrat.

Math::BigInt, Math::BigFloat, Math::BigRat и Math::Big, а также Math::BigInt::FastCalc, Math::BigInt::Pari и Math::BigInt::GMP.

АВТОРЫ

  • (C) автор Tels http://bloodgate.com/ в начале 2002-2007 гг.

  • Поддерживается Peter John Acklam <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.30.3/bigint

Spec-Zone.ru

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