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.
СМОТРИТЕ ТАКЖЕ
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