bigfloat
СОДЕРЖАНИЕ
ИМЯ
bigfloat - поддержка чисел с плавающей точкой большой точности для Perl
СИНТАКСИС
use bigfloat;
$x = 2 + 4.5; # Math::BigFloat 6.5
print 2 ** 512 * 0.1; # Math::BigFloat 134...09.6
print inf + 42; # Math::BigFloat inf
print NaN * 7; # Math::BigFloat NaN
print hex("0x1234567890123490"); # Perl v5.10.0 or later
{
no bigfloat;
print 2 ** 256; # a normal Perl scalar now
}
# for older Perls, import into current package:
use bigfloat qw/hex oct/;
print hex("0x1234567890123490");
print oct("01234567890123490"); ОПИСАНИЕ
Все числовые литералы в заданном области видимости преобразуются в объекты Math::BigFloat.
Все операторы (включая основные математические операции), кроме оператора диапазона .. перегружены.
Например:
use bigfloat;
$x = 1234; создаёт объект Math::BigFloat и сохраняет ссылку на него в $x. Это происходит прозрачно и незаметно для пользователя.
Это можно увидеть следующим образом:
perl -Mbigfloat -le 'print ref(1234)' Поскольку числа на самом деле являются объектами, вы можете вызывать все обычные методы из Math::BigFloat для них. Это работает даже в некоторой степени с выражениями:
perl -Mbigfloat -le '$x = 1234; print $x->bdec()'
perl -Mbigfloat -le 'print 1234->copy()->binc();'
perl -Mbigfloat -le 'print 1234->copy()->binc->badd(6);'
perl -Mbigfloat -le 'print +(1234)->copy()->binc()' (Обратите внимание, что print не делает того, что ожидается, если выражение начинается с '(', поэтому +)
Вы даже можете объединять операции как обычно:
perl -Mbigfloat -le 'print 1234->copy()->binc->badd(6);'
1241 Обратите внимание, что следующее не работает как ожидается (ничего не печатает), так как перегрузка оператора '..' пока невозможна в Perl (начиная с версии 5.8.0):
perl -Mbigfloat -le 'for (1..2) { print ref($_); }' Параметры
bigfloat распознаёт некоторые параметры, которые могут быть переданы при его загрузке через use. Доступны следующие параметры:
- a или точность
-
Это устанавливает точность для всех математических операций. Аргумент должен быть больше или равен нулю. Смотрите метод bround() в Math::BigInt для получения подробной информации.
perl -Mbigfloat=a,50 -le 'print sqrt(20)'Обратите внимание, что одновременная установка точности и погрешности невозможна.
- p или точность
-
Это устанавливает точность для всех математических операций. Аргумент может быть любым целым числом. Отрицательные значения означают фиксированное количество цифр после запятой, в то время как положительное значение округляет до этой цифры слева от запятой. 0 означает округление до целого числа. Смотрите метод bfround() в Math::BigInt для получения подробной информации.
perl -Mbigfloat=p,-50 -le 'print sqrt(20)'Обратите внимание, что одновременная установка точности и погрешности невозможна.
- t или трассировка
-
Это включает режим трассировки и предназначен в первую очередь для отладки.
- l, lib, try или только
-
Загрузить другую библиотеку математических функций, см. "Библиотека математических функций".
perl -Mbigfloat=l,GMP -e 'print 2 ** 512' perl -Mbigfloat=lib,GMP -e 'print 2 ** 512' perl -Mbigfloat=try,GMP -e 'print 2 ** 512' perl -Mbigfloat=only,GMP -e 'print 2 ** 512' - hex
-
Переопределить встроенный метод hex() версией, которая может обрабатывать большие числа. Это переопределяет его, экспортируя в текущий пакет. В Perl версии 5.10.0 и выше это не так необходимо, так как hex() лексически переопределяется в текущей области видимости, когда активен pragma
bigfloat. - oct
-
Переопределить встроенный метод oct() версией, которая может обрабатывать большие числа. Это переопределяет его, экспортируя в текущий пакет. В Perl версии 5.10.0 и выше это не так необходимо, так как oct() лексически переопределяется в текущей области видимости, когда активен pragma
bigfloat. - v или версия
-
выводит имя и версию модулей, а затем завершает работу.
perl -Mbigfloat=v
Библиотека математических функций
Математические вычисления с числами выполняются (по умолчанию) с помощью модуля-библиотеки Math::BigInt::Calc. По умолчанию это эквивалентно:
use bigfloat lib => 'Calc'; вы можете изменить это, используя:
use bigfloat lib => 'GMP'; Следующее сначала попытается найти Math::BigInt::Foo, затем Math::BigInt::Bar, и если это также не удастся, вернётся к Math::BigInt::Calc:
use bigfloat lib => 'Foo,Math::BigInt::Bar'; Использование c<lib> предупреждает, если ни одна из указанных библиотек не найдена и Math::BigInt вернулся к одной из стандартных библиотек. Чтобы подавить это предупреждение, используйте c<try> вместо этого:
use bigfloat try => 'GMP'; Если вы хотите, чтобы код завершался ошибкой вместо возврата к стандартной библиотеке, используйте only вместо этого:
use bigfloat only => 'GMP'; Дополнительную информацию см. в документации соответствующих модулей.
Вызовы методов
Поскольку все числа теперь являются объектами, вы можете использовать все методы, которые являются частью API Math::BigFloat.
Но следует предупредить. При использовании следующего для создания копии числа будет создана только поверхностная копия.
$x = 9; $y = $x;
$x = $y = 7; Использование копии или оригинального числа с перегруженной математикой допустимо, например, следующее работает:
$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, а также документацию в Math::BigFloat для получения дополнительной информации.
Методы
- inf()
-
Сокращение для возврата Math::BigFloat->binf(). Полезно, поскольку Perl не всегда правильно обрабатывает необработанные слова
inf. - NaN()
-
Сокращение для возврата Math::BigFloat->bnan(). Полезно, поскольку Perl не всегда правильно обрабатывает необработанные слова
NaN. - e
-
# perl -Mbigfloat=e -wle 'print e'Возвращает число Эйлера
e, т.е. exp(1). - PI
-
# perl -Mbigfloat=PI -wle 'print PI'Возвращает число PI.
- bexp()
-
bexp($power, $accuracy);Возвращает число Эйлера
e, возведённое в соответствующую степень, с требуемой точностью.Пример:
# perl -Mbigfloat=bexp -wle 'print bexp(1,80)' - bpi()
-
bpi($accuracy);Возвращает число PI с требуемой точностью.
Пример:
# perl -Mbigfloat=bpi -wle 'print bpi(80)' - accuracy()
-
Устанавливает или получает точность.
- precision()
-
Устанавливает или получает точность.
- round_mode()
-
Устанавливает или получает режим округления.
- div_scale()
-
Устанавливает или получает масштаб деления.
- upgrade()
-
Устанавливает или получает класс, к которому понижает класс, если таковой имеется. Установите класс upgrade в
undefдля отключения повышения.Повышение по умолчанию отключено.
- downgrade()
-
Устанавливает или получает класс, к которому повышает класс, если таковой имеется. Установите класс downgrade в
undefдля отключения понижения.Понижение по умолчанию отключено.
- in_effect()
-
use bigfloat; print "in effect\n" if bigfloat::in_effect; # true { no bigfloat; print "in effect\n" if bigfloat::in_effect; # false }Возвращает true или false, если
bigfloatактивен в текущей области видимости.Этот метод работает только в Perl версии 5.9.4 и выше.
ЗАМЕЧАНИЯ
- Шестнадцатеричные, восьмеричные и двоичные литералы чисел с плавающей точкой
-
Perl (и этот модуль) поддерживают шестнадцатеричные, восьмеричные и двоичные литералы чисел с плавающей точкой, но используйте их с осторожностью с версиями Perl ниже 5.32.0, так как в некоторых версиях Perl результат может быть неверным.
- Перегрузка операторов по сравнению с перегрузкой литералов
-
bigratработает путём перегрузки обработки целочисленных и чисел с плавающей точкой, преобразуя их в объекты Math::BigRat.Это означает, что арифметические операции, включающие только строковые значения или строковые литералы, выполняются с помощью встроенных операторов Perl.
Например:
use bigrat; my $x = "900000000000000009"; my $y = "900000000000000007"; print $x - $y;выводит
0на 32-битных системах по умолчанию, так какbigfloatникогда не видит строковые литералы. Чтобы убедиться, что всё выражение обрабатывается как объектыMath::BigFloat, используйте числовой литерал в выражении:print +(0+$x) - $y; - Диапазоны
-
Perl не позволяет перегрузку диапазонов, поэтому вы не можете безопасно использовать диапазоны с
bigfloatточками конечных значений, и переменная итератора не являетсяMath::BigFloat.use 5.010; for my $i (12..13) { for my $j (20..21) { say $i ** $j; # produces a floating-point number, # not an object } } - in_effect()
-
Этот метод работает только в Perl версии 5.9.4 и выше.
- hex()/oct()
-
bigfloatпереопределяет эти функции версиями, которые также могут обрабатывать целые числа большой точности. Однако в Perl до версии 5.9.4 это не произойдёт, если вы не запросите это явно с помощью двух тегов импорта "hex" и "oct" - и тогда это будет глобальным и не может быть отключено внутри области видимости сno bigfloat:use bigfloat qw/hex oct/; print hex("0x1234567890123456"); { no bigfloat; print hex("0x1234567890123456"); }Второй вызов hex() выдаст предупреждение о непереносимой константе.
Сравните это с:
use bigfloat; # will warn only under Perl older than v5.9.4 print hex("0x1234567890123456");
ПРИМЕРЫ
Несколько интересных примеров командной строки для впечатлений Python-разработчиков ;)
perl -Mbigfloat -le 'print sqrt(33)'
perl -Mbigfloat -le 'print 2**255'
perl -Mbigfloat -le 'print 4.5+2**255'
perl -Mbigfloat -le 'print 3/7 + 5/7 + 8/3'
perl -Mbigfloat -le 'print 123->is_odd()'
perl -Mbigfloat -le 'print log(2)'
perl -Mbigfloat -le 'print exp(1)'
perl -Mbigfloat -le 'print 2 ** 0.5'
perl -Mbigfloat=a,65 -le 'print 2 ** 0.2'
perl -Mbigfloat=l,GMP -le 'print 7 ** 7777' ОШИБКИ
Пожалуйста, сообщайте об ошибках или пожеланиях по функциям по адресу bug-bignum at rt.cpan.org, или через веб-интерфейс по адресу https://rt.cpan.org/Ticket/Create.html?Queue=bignum (требуется вход). Мы будем уведомлены, и затем вы автоматически будете уведомлены о ходе исправления вашей ошибки, когда я внесу изменения.
ПОДДЕРЖКА
Вы можете найти документацию по этому модулю с помощью команды perldoc.
perldoc bigfloat Вы также можете найти информацию по следующим ресурсам:
-
GitHub
-
RT: трекер запросов CPAN
-
MetaCPAN
-
Матрица тестеров CPAN
-
Рейтинги CPAN
ЛИЦЕНЗИЯ
Эта программа является свободной программой; вы можете перераспределять и/или изменять её на тех же условиях, что и сам 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–2023 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.38.0/bigfloat