Spec-Zone.ru › Perl 5.34

bigrat

СОДЕРЖАНИЕ

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

ИМЯ

bigrat - Поддержка прозрачных чисел с большой точностью и рациональных чисел большой точности для Perl

СИНОПСИС

use bigrat;

print 2 + 4.5,"\n";                   # BigFloat 6.5
print 1/3 + 1/4,"\n";                 # produces 7/12

{
  no bigrat;
  print 1/3,"\n";                     # 0.33333...
}

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

ОПИСАНИЕ

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

В отличие от модуля bignum, этот модуль обновляется до Math::BigRat, что означает, что вместо 2.5 в выводе вы получите 2+1/2.

Используемые модули

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

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

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

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

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

use bigrat lib => 'Calc';

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

use bignum lib => 'GMP';

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

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

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

use bignum try => 'GMP';

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

use bignum only => 'GMP';

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

Знак

Знак может быть '+', '-', 'NaN', '+inf' или '-inf'.

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

Методы

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

inf()

Сокращение для возврата Math::BigInt->binf(). Полезно, поскольку Perl не всегда обрабатывает слова inf правильно.

NaN()

Сокращение для возврата Math::BigInt->bnan(). Полезно, поскольку Perl не всегда обрабатывает слова NaN правильно.

e
# perl -Mbigrat=e -wle 'print e'

Возвращает число Эйлера e, также известное как exp(1).

PI
# perl -Mbigrat=PI -wle 'print PI'

Возвращает число Пи.

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

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

Пример:

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

Возвращает число Пи с желаемой точностью.

Пример:

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

Возвращает класс, к которому числа обновляются, фактически возвращая $Math::BigInt::upgrade.

in_effect()
use bigrat;

print "in effect\n" if bigrat::in_effect;       # true
{
  no bigrat;
  print "in effect\n" if bigrat::in_effect;     # false
}

Возвращает true или false, если bigrat активен в текущем объёме.

Этот метод работает только в Perl версии 5.9.4 и выше.

БИБЛИОТЕКА МАТЕМАТИЧЕСКИХ ФУНКЦИЙ

Математические операции с числами выполняются (по умолчанию) модулем

Ограничение

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

$x = 9; $y = $x;
$x = $y = 7;

Если вы хотите создать истинную копию, используйте следующее:

$y = $x->copy();

Использование копии или оригинала с перегруженной математикой допустимо, например, следующее работает:

$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 для получения дополнительных сведений.

Параметры

bignum распознаёт некоторые параметры, которые можно передать при его загрузке с помощью use. Параметры могут (в настоящее время) быть в виде одной буквы или в длинной форме. Существуют следующие параметры:

a или accuracy

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

perl -Mbigrat=a,50 -le 'print sqrt(20)'

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

p или precision

Устанавливает точность для всех математических операций. Аргумент может быть любым целым числом. Отрицательные значения означают фиксированное число цифр после запятой, а положительные — округление до этой цифры слева от запятой. 0 или 1 означают округление до целого числа. См. функцию bfround() в Math::BigInt для получения дополнительных сведений.

perl -Mbigrat=p,-50 -le 'print sqrt(20)'

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

t или trace

Включает режим отслеживания, который в основном предназначен для отладки bignum или Math::BigInt/Math::BigFloat.

l или lib

Загружает другую библиотеку математических функций, см. "БИБЛИОТЕКА МАТЕМАТИЧЕСКИХ ФУНКЦИЙ".

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

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

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

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

hex

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

oct

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

v или version

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

perl -Mbigrat=v

ОГРАНИЧЕНИЯ

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

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

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

Например:

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

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

print +(0+$x) - $y;
in_effect()

Этот метод работает только в Perl версии 5.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");

ПРИМЕРЫ

perl -Mbigrat -le 'print sqrt(33)'
perl -Mbigrat -le 'print 2*255'
perl -Mbigrat -le 'print 4.5+2*255'
perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'
perl -Mbigrat -le 'print 12->is_odd()';
perl -Mbignum=l,GMP -le 'print 7 ** 7777'

ОШИБКИ

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

perldoc bignum

ПОДДЕРЖКА

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

perldoc bigrat

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

perldoc bignum

ЛИЦЕНЗИЯ

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

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

bignum и bigint.

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–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.34.0/bigrat

Spec-Zone.ru

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