Spec-Zone.ru › Perl 5.32

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

Дополнительную информацию см. в документации по конструктору копий и = в overload, а также в документации модуля BigInt.

Параметры

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

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

Spec-Zone.ru

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