Spec-Zone.ru › Perl 5.28

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'

Возвращает PI.

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

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

Пример:

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

Возвращает PI с требуемой точностью.

Пример:

# 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 v5.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)'

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

p или precision

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

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

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

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() лексически переопределяется в текущем контексте, когда активен pragma bigrat.

oct

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

ПРИМЕРЫ

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) Tels http://bloodgate.com/ начало 2002 — 2007.

  • Peter John Acklam <pjacklam@gmail.com>, 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/bigrat

Spec-Zone.ru

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