Spec-Zone.ru › Perl 5.36

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 до v5.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 до версии v5.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

    https://github.com/pjacklam/p5-bignum

  • RT: система отслеживания ошибок CPAN

    https://rt.cpan.org/Dist/Display.html?Name=bignum

  • MetaCPAN

    https://metacpan.org/release/bignum

  • Матрица тестирования CPAN Testers

    http://matrix.cpantesters.org/?dist=bignum

  • Рейтинги CPAN

    https://cpanratings.perl.org/dist/bignum

ЛИЦЕНЗИЯ

Эта программа является свободным программным обеспечением; вы можете распространять и/или изменять ее на тех же условиях, что и Perl сам по себе.

СМОТРИТЕ ТАКЖЕ

bigint и bigrat.

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>, 2014 -.

END_OF_DOCUMENT_MARKER

© 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.36.0/bigfloat

Spec-Zone.ru

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