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 сам по себе.
СМОТРИТЕ ТАКЖЕ
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