目录

名称

Math::BigFloat - 任意大小浮点数学包

概要

use Math::BigFloat;

# Configuration methods (may be used as class methods and instance methods)

Math::BigFloat->accuracy();     # get class accuracy
Math::BigFloat->accuracy($n);   # set class accuracy
Math::BigFloat->precision();    # get class precision
Math::BigFloat->precision($n);  # set class precision
Math::BigFloat->round_mode();   # get class rounding mode
Math::BigFloat->round_mode($m); # set global round mode, must be one of
                                # 'even', 'odd', '+inf', '-inf', 'zero',
                                # 'trunc', or 'common'
Math::BigFloat->config("lib");  # name of backend math library

# Constructor methods (when the class methods below are used as instance
# methods, the value is assigned the invocand)

$x = Math::BigFloat->new($str);               # defaults to 0
$x = Math::BigFloat->new('0x123');            # from hexadecimal
$x = Math::BigFloat->new('0o377');            # from octal
$x = Math::BigFloat->new('0b101');            # from binary
$x = Math::BigFloat->from_hex('0xc.afep+3');  # from hex
$x = Math::BigFloat->from_hex('cafe');        # ditto
$x = Math::BigFloat->from_oct('1.3267p-4');   # from octal
$x = Math::BigFloat->from_oct('01.3267p-4');  # ditto
$x = Math::BigFloat->from_oct('0o1.3267p-4'); # ditto
$x = Math::BigFloat->from_oct('0377');        # ditto
$x = Math::BigFloat->from_bin('0b1.1001p-4'); # from binary
$x = Math::BigFloat->from_bin('0101');        # ditto
$x = Math::BigFloat->from_ieee754($b, "binary64");  # from IEEE-754 bytes
$x = Math::BigFloat->bzero();                 # create a +0
$x = Math::BigFloat->bone();                  # create a +1
$x = Math::BigFloat->bone('-');               # create a -1
$x = Math::BigFloat->binf();                  # create a +inf
$x = Math::BigFloat->binf('-');               # create a -inf
$x = Math::BigFloat->bnan();                  # create a Not-A-Number
$x = Math::BigFloat->bpi();                   # returns pi

$y = $x->copy();        # make a copy (unlike $y = $x)
$y = $x->as_int();      # return as BigInt
$y = $x->as_float();    # return as a Math::BigFloat
$y = $x->as_rat();      # return as a Math::BigRat

# Boolean methods (these don't modify the invocand)

$x->is_zero();          # if $x is 0
$x->is_one();           # if $x is +1
$x->is_one("+");        # ditto
$x->is_one("-");        # if $x is -1
$x->is_inf();           # if $x is +inf or -inf
$x->is_inf("+");        # if $x is +inf
$x->is_inf("-");        # if $x is -inf
$x->is_nan();           # if $x is NaN

$x->is_positive();      # if $x > 0
$x->is_pos();           # ditto
$x->is_negative();      # if $x < 0
$x->is_neg();           # ditto

$x->is_odd();           # if $x is odd
$x->is_even();          # if $x is even
$x->is_int();           # if $x is an integer

# Comparison methods

$x->bcmp($y);           # compare numbers (undef, < 0, == 0, > 0)
$x->bacmp($y);          # compare absolutely (undef, < 0, == 0, > 0)
$x->beq($y);            # true if and only if $x == $y
$x->bne($y);            # true if and only if $x != $y
$x->blt($y);            # true if and only if $x < $y
$x->ble($y);            # true if and only if $x <= $y
$x->bgt($y);            # true if and only if $x > $y
$x->bge($y);            # true if and only if $x >= $y

# Arithmetic methods

$x->bneg();             # negation
$x->babs();             # absolute value
$x->bsgn();             # sign function (-1, 0, 1, or NaN)
$x->bnorm();            # normalize (no-op)
$x->binc();             # increment $x by 1
$x->bdec();             # decrement $x by 1
$x->badd($y);           # addition (add $y to $x)
$x->bsub($y);           # subtraction (subtract $y from $x)
$x->bmul($y);           # multiplication (multiply $x by $y)
$x->bmuladd($y,$z);     # $x = $x * $y + $z
$x->bdiv($y);           # division (floored), set $x to quotient
                        # return (quo,rem) or quo if scalar
$x->btdiv($y);          # division (truncated), set $x to quotient
                        # return (quo,rem) or quo if scalar
$x->bmod($y);           # modulus (x % y)
$x->btmod($y);          # modulus (truncated)
$x->bmodinv($mod);      # modular multiplicative inverse
$x->bmodpow($y,$mod);   # modular exponentiation (($x ** $y) % $mod)
$x->bpow($y);           # power of arguments (x ** y)
$x->blog();             # logarithm of $x to base e (Euler's number)
$x->blog($base);        # logarithm of $x to base $base (e.g., base 2)
$x->bexp();             # calculate e ** $x where e is Euler's number
$x->bnok($y);           # x over y (binomial coefficient n over k)
$x->bsin();             # sine
$x->bcos();             # cosine
$x->batan();            # inverse tangent
$x->batan2($y);         # two-argument inverse tangent
$x->bsqrt();            # calculate square root
$x->broot($y);          # $y'th root of $x (e.g. $y == 3 => cubic root)
$x->bfac();             # factorial of $x (1*2*3*4*..$x)

$x->blsft($n);          # left shift $n places in base 2
$x->blsft($n,$b);       # left shift $n places in base $b
                        # returns (quo,rem) or quo (scalar context)
$x->brsft($n);          # right shift $n places in base 2
$x->brsft($n,$b);       # right shift $n places in base $b
                        # returns (quo,rem) or quo (scalar context)

# Bitwise methods

$x->band($y);           # bitwise and
$x->bior($y);           # bitwise inclusive or
$x->bxor($y);           # bitwise exclusive or
$x->bnot();             # bitwise not (two's complement)

# Rounding methods
$x->round($A,$P,$mode); # round to accuracy or precision using
                        # rounding mode $mode
$x->bround($n);         # accuracy: preserve $n digits
$x->bfround($n);        # $n > 0: round to $nth digit left of dec. point
                        # $n < 0: round to $nth digit right of dec. point
$x->bfloor();           # round towards minus infinity
$x->bceil();            # round towards plus infinity
$x->bint();             # round towards zero

# Other mathematical methods

$x->bgcd($y);            # greatest common divisor
$x->blcm($y);            # least common multiple

# Object property methods (do not modify the invocand)

$x->sign();              # the sign, either +, - or NaN
$x->digit($n);           # the nth digit, counting from the right
$x->digit(-$n);          # the nth digit, counting from the left
$x->length();            # return number of digits in number
($xl,$f) = $x->length(); # length of number and length of fraction
                         # part, latter is always 0 digits long
                         # for Math::BigInt objects
$x->mantissa();          # return (signed) mantissa as BigInt
$x->exponent();          # return exponent as BigInt
$x->parts();             # return (mantissa,exponent) as BigInt
$x->sparts();            # mantissa and exponent (as integers)
$x->nparts();            # mantissa and exponent (normalised)
$x->eparts();            # mantissa and exponent (engineering notation)
$x->dparts();            # integer and fraction part
$x->fparts();            # numerator and denominator
$x->numerator();         # numerator
$x->denominator();       # denominator

# Conversion methods (do not modify the invocand)

$x->bstr();         # decimal notation, possibly zero padded
$x->bsstr();        # string in scientific notation with integers
$x->bnstr();        # string in normalized notation
$x->bestr();        # string in engineering notation
$x->bdstr();        # string in decimal notation
$x->bfstr();        # string in fractional notation

$x->as_hex();       # as signed hexadecimal string with prefixed 0x
$x->as_bin();       # as signed binary string with prefixed 0b
$x->as_oct();       # as signed octal string with prefixed 0
$x->to_ieee754($format); # to bytes encoded according to IEEE 754-2008

# Other conversion methods

$x->numify();           # return as scalar (might overflow or underflow)

描述

Math::BigFloat 提供对任意精度浮点的支持。还为 Perl 操作符提供了重载。

如果您将大浮点数声明为

$x = Math::BigFloat -> new('12_3.456_789_123_456_789E-2');

使用重载操作符进行的操作会保留参数,这正是您所期望的。

输入

这些例程的输入值可以是任何标量数字或看起来像数字的字符串。Perl 接受的任何内容作为字面数字常量,都应该被此模块接受。

有效字符串输入的一些示例

Input string                Resulting value

123                         123
1.23e2                      123
12300e-2                    123

67_538_754                  67538754
-4_5_6.7_8_9e+0_1_0         -4567890000000

0x13a                       314
0x13ap0                     314
0x1.3ap+8                   314
0x0.00013ap+24              314
0x13a000p-12                314

0o472                       314
0o1.164p+8                  314
0o0.0001164p+20             314
0o1164000p-10               314

0472                        472     Note!
01.164p+8                   314
00.0001164p+20              314
01164000p-10                314

0b100111010                 314
0b1.0011101p+8              314
0b0.00010011101p+12         314
0b100111010000p-3           314

0x1.921fb5p+1               3.14159262180328369140625e+0
0o1.2677025p1               2.71828174591064453125
01.2677025p1                2.71828174591064453125
0b1.1001p-4                 9.765625e-2

输出

输出值通常是 Math::BigFloat 对象。

布尔运算符 is_zero()is_one()is_inf() 等返回 true 或 false。

比较运算符 bcmp()bacmp()) 返回 -1、0、1 或 undef。

方法

Math::BigFloat 支持 Math::BigInt 支持的所有方法,但它在可能的情况下计算非整数结果。请参阅 Math::BigInt 以获取每种方法的完整说明。以下是最重要的区别

配置方法

accuracy()
$x->accuracy(5);           # local for $x
CLASS->accuracy(5);        # global for all members of CLASS
                           # Note: This also applies to new()!

$A = $x->accuracy();       # read out accuracy that affects $x
$A = CLASS->accuracy();    # read out global accuracy

设置或获取全局或局部精度,又称结果有多少有效数字。如果您设置了全局精度,那么这也适用于 new()!

警告!精度粘贴,例如,一旦您在 CLASS->accuracy($A) 的影响下创建了一个数字,使用该数字进行数学运算的所有结果也将被四舍五入。

在大多数情况下,您可能应该使用 Math::BigInt 中的“round()”Math::BigInt 中的“bround()”Math::BigInt 中的“bfround()” 显式舍入结果,或将所需的精度作为附加参数传递给数学运算

my $x = Math::BigInt->new(30000);
my $y = Math::BigInt->new(7);
print scalar $x->copy()->bdiv($y, 2);           # print 4300
print scalar $x->copy()->bdiv($y)->bround(2);   # print 4300
precision()
$x->precision(-2);        # local for $x, round at the second
                          # digit right of the dot
$x->precision(2);         # ditto, round at the second digit
                          # left of the dot

CLASS->precision(5);      # Global for all members of CLASS
                          # This also applies to new()!
CLASS->precision(-5);     # ditto

$P = CLASS->precision();  # read out global precision
$P = $x->precision();     # read out precision that affects $x

注意:您可能希望改用 “accuracy()”。使用 “accuracy()” 设置每个结果应有的数字数,使用 “precision()” 设置舍入位置!

构造方法

from_hex()
$x -> from_hex("0x1.921fb54442d18p+1");
$x = Math::BigFloat -> from_hex("0x1.921fb54442d18p+1");

将输入解释为十六进制字符串。前缀(“0x”、“x”,忽略大小写)是可选的。任何两个数字之间可以放置一个下划线字符(“_”)。如果输入无效,则返回 NaN。指数使用十进制数字以 2 为底。

如果作为实例方法调用,则该值将分配给调用者。

from_oct()
$x -> from_oct("1.3267p-4");
$x = Math::BigFloat -> from_oct("1.3267p-4");

将输入解释为八进制字符串。可以在任意两个数字之间放置一个下划线字符 (“_”)。如果输入无效,则返回 NaN。指数使用十进制数字以 2 为底。

如果作为实例方法调用,则该值将分配给调用者。

from_bin()
$x -> from_bin("0b1.1001p-4");
$x = Math::BigFloat -> from_bin("0b1.1001p-4");

将输入解释为十六进制字符串。前缀 (“0b” 或 “b”,忽略大小写) 是可选的。可以在任意两个数字之间放置一个下划线字符 (“_”)。如果输入无效,则返回 NaN。指数使用十进制数字以 2 为底。

如果作为实例方法调用,则该值将分配给调用者。

from_ieee754()

将输入解释为按照 IEEE754-2008 中描述的值进行编码。输入可以作为字节字符串、十六进制字符串或二进制字符串给出。输入假定为大端字节序。

# both $dbl and $mbf are 3.141592...
$bytes = "\x40\x09\x21\xfb\x54\x44\x2d\x18";
$dbl = unpack "d>", $bytes;
$mbf = Math::BigFloat -> from_ieee754($bytes, "binary64");
bpi()
print Math::BigFloat->bpi(100), "\n";

计算 PI 至 N 位数字(包括小数点前的 3 位)。结果根据当前舍入模式进行舍入,该模式默认为 “even”。

此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。

算术方法

bmuladd()
$x->bmuladd($y,$z);

将 $x 乘以 $y,然后将 $z 加到结果中。

此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。

bdiv()
$q = $x->bdiv($y);
($q, $r) = $x->bdiv($y);

在标量上下文中,将 $x 除以 $y 并将结果返回到给定的或默认的精度/准确度。在列表上下文中,执行取整除(F 除法),返回一个整数 $q 和一个余数 $r,使得 $x = $q * $y + $r。余数(模)等于 $x->bmod($y) 返回的值。

bmod()
$x->bmod($y);

返回 $x 模 $y。当 $x 为有限值,且 $y 为有限且非零值时,结果与取整除(F 除法)后的余数相同。此外,如果 $x 和 $y 都是整数,则结果与 Perl 的 % 运算符的结果相同。

bexp()
$x->bexp($accuracy);            # calculate e ** X

计算表达式 e ** $x,其中 e 是欧拉数。

此方法在 Math::BigInt 的 v1.82 中添加(2007 年 4 月)。

bnok()
$x->bnok($y);   # x over y (binomial coefficient n over k)

计算 k 中的二项式系数 n,也称为“选择”函数。结果等效于

( n )      n!
| - |  = -------
( k )    k!(n-k)!

此方法在 Math::BigInt 的 v1.84 中添加(2007 年 4 月)。

bsin()
my $x = Math::BigFloat->new(1);
print $x->bsin(100), "\n";

计算 $x 的正弦,修改 $x。

此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。

bcos()
my $x = Math::BigFloat->new(1);
print $x->bcos(100), "\n";

计算 $x 的余弦,修改 $x。

此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。

batan()
my $x = Math::BigFloat->new(1);
print $x->batan(100), "\n";

计算 $x 的反正切,修改 $x。另请参见 "batan2()"

此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。

batan2()
my $y = Math::BigFloat->new(2);
my $x = Math::BigFloat->new(3);
print $y->batan2($x), "\n";

计算 $y 除以 $x 的反正切,修改 $y。另请参见 "batan()"

此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。

as_float()

当 Math::BigFloat 遇到它不知道如何处理的对象时,将调用此方法。例如,假设 $x 是 Math::BigFloat 或其子类,并且 $y 已定义,但不是 Math::BigFloat 或其子类。如果您执行

$x -> badd($y);

$y 需要转换为 $x 可以处理的对象。首先检查 $y 是否是 $x 可以升级到的对象。如果是这种情况,则不会进行进一步的尝试。接下来是查看 $y 是否支持 as_float() 方法。as_float() 方法应返回一个与 $x 具有相同类或其子类的对象,或一个 ref($x)->new() 可以解析以创建对象的字符串。

在 Math::BigFloat 中,as_float() 的效果与 copy() 相同。

to_ieee754()

按照 IEEE 754-2008 中指定的给定格式将尾数编码为字节字符串。请注意,编码值是该值的最近可能表示。此值可能与尾数中的值不完全相同。

# $x = 3.1415926535897932385
$x = Math::BigFloat -> bpi(30);

$b = $x -> to_ieee754("binary64");  # encode as 8 bytes
$h = unpack "H*", $b;               # "400921fb54442d18"

# 3.141592653589793115997963...
$y = Math::BigFloat -> from_ieee754($h, "binary64");

IEEE 754-2008 中的所有二进制格式均被接受。为方便起见,识别了一些别名:“half”表示“binary16”,“single”表示“binary32”,“double”表示“binary64”,“quadruple”表示“binary128”,“octuple”表示“binary256”,而“sexdecuple”表示“binary512”。

另请参见 https://en.wikipedia.org/wiki/IEEE_754

准确度和精度

另请参见:舍入

Math::BigFloat 同时支持精度(在小数点前或后舍入到某个位置)和准确度(舍入到某个数字位数)。有关这些主题的完整文档、示例和提示,请参见 Math::BigInt 中关于舍入的大部分内容。

由于诸如 sqrt(2)1 / 3 之类的东西必须以有限的准确度呈现,以免操作消耗所有资源,因此每个操作产生的数字位数不会超过请求的数字位数。

如果没有设置全局精度或准确度,并且未使用请求的精度或准确度调用相关操作,并且输入 $x 没有设置精度或准确度,那么将使用后备参数。出于历史原因,它被称为 div_scale,可以通过以下方式访问

$d = Math::BigFloat->div_scale();       # query
Math::BigFloat->div_scale($n);          # set to $n digits

div_scale 的默认值为 40。

如果某个操作的结果数字位数多于指定数字位数,则对其进行舍入。采用的舍入模式要么是默认模式,要么是scale 之后提供给操作的模式

$x = Math::BigFloat->new(2);
Math::BigFloat->accuracy(5);              # 5 digits max
$y = $x->copy()->bdiv(3);                 # gives 0.66667
$y = $x->copy()->bdiv(3,6);               # gives 0.666667
$y = $x->copy()->bdiv(3,6,undef,'odd');   # gives 0.666667
Math::BigFloat->round_mode('zero');
$y = $x->copy()->bdiv(3,6);               # will also give 0.666667

请注意,Math::BigFloat->accuracy()Math::BigFloat->precision() 设置全局变量,因此任何新创建的数字都将立即受到全局舍入的影响。这意味着在上面的示例中,作为 bdiv() 参数的 3 也将获得5 的准确度。

要么完全计算结果,然后显式舍入,要么使用数学函数的其他参数,如下所示,这样会更不容易混淆

use Math::BigFloat;
$x = Math::BigFloat->new(2);
$y = $x->copy()->bdiv(3);
print $y->bround(5),"\n";               # gives 0.66667

or

use Math::BigFloat;
$x = Math::BigFloat->new(2);
$y = $x->copy()->bdiv(3,5);             # gives 0.66667
print "$y\n";

舍入

bfround ( +$scale )

从“.” 向左舍入到第 $scale 位,从点开始计数。第一个数字编号为 1。

bfround ( -$scale )

从“.” 向右舍入到第 $scale 位,从点开始计数。

bfround ( 0 )

舍入为整数。

bround ( +$scale )

保留从左侧开始的 $scale 位的精度(又称有效位数),并用零填充其余部分。如果数字介于 1 和 -1 之间,则有效位数从“.”之后的第一个非零位开始计数。

bround ( -$scale ) 和 bround ( 0 )

这些实际上是无操作。

所有舍入函数都将以下内容之一作为第二个参数,作为舍入模式:'even'、'odd'、'+inf'、'-inf'、'zero'、'trunc' 或 'common'。

默认舍入模式为 'even'。通过使用 Math::BigFloat->round_mode($round_mode);,您可以获取和设置后续舍入的默认模式。不再支持使用 $Math::BigFloat::$round_mode。然后,舍入函数的第二个参数会暂时覆盖默认值。

as_number() 函数从 Math::BigFloat 返回一个 BigInt。它使用 'trunc' 作为舍入模式,使其等效于

$x = 2.5;
$y = int($x) + 2;

您可以通过将所需的舍入模式作为参数传递给 as_number() 来覆盖此模式

$x = Math::BigFloat->new(2.5);
$y = $x->as_number('odd');      # $y = 3

NUMERIC LITERALS

use Math::BigFloat ':constant' 之后,给定范围内所有数字文字都将转换为 Math::BigFloat 对象。此转换在编译时发生。

例如,

perl -MMath::BigFloat=:constant -le 'print 2e-150'

打印 2e-150 的确切值。请注意,如果不转换常量,则使用 Perl 标量计算表达式 2e-150,这会导致不准确的结果。

请注意,字符串不受影响,因此

use Math::BigFloat qw/:constant/;

$y = "1234567890123456789012345678901234567890"
        + "123456789123456789";

不会给您您期望的结果。您需要在至少一个操作数周围显式使用 Math::BigFloat->new()。您还应该引用大常量以防止精度损失

use Math::BigFloat;

$x = Math::BigFloat->new("1234567889123456789123456789123456789");

如果没有引号,Perl 会在编译时将大数字转换为浮点数常量,然后在运行时将结果转换为 Math::BigFloat 对象,这会导致不准确的结果。

十六进制、八进制和二进制浮点数文字

Perl(和此模块)接受十六进制、八进制和二进制浮点数文字,但在 v5.32.0 之前的 Perl 版本中要谨慎使用,因为某些版本的 Perl 会在不提示的情况下给出错误的结果。下面是一些用不同方式编写十进制数 314 的示例。

十六进制浮点数文字

0x1.3ap+8         0X1.3AP+8
0x1.3ap8          0X1.3AP8
0x13a0p-4         0X13A0P-4

八进制浮点数文字(带“0”前缀)

01.164p+8         01.164P+8
01.164p8          01.164P8
011640p-4         011640P-4

八进制浮点字面量(带有“0o”前缀)(需要 v5.34.0)

0o1.164p+8        0O1.164P+8
0o1.164p8         0O1.164P8
0o11640p-4        0O11640P-4

二进制浮点字面量

0b1.0011101p+8    0B1.0011101P+8
0b1.0011101p8     0B1.0011101P8
0b10011101000p-2  0B10011101000P-2

数学库

使用名为 Math::BigInt::Calc 的模块(默认情况下)对数字进行数学运算。这等同于说

use Math::BigFloat lib => "Calc";

你可以使用以下方法来更改此设置

use Math::BigFloat lib => "GMP";

注意:通用程序包不应明确指定要使用的库;让脚本作者决定哪种库最合适。

注意:当无法加载请求的库时,关键字“lib”会发出警告。要禁止该警告,请改用“try”

use Math::BigFloat try => "GMP";

如果你的脚本使用非常大的数字,而 Calc 对它们来说太慢,你还可以加载以下某个库,如果无法使用任何库,代码将终止

use Math::BigFloat only => "GMP,Pari";

以下代码将首先尝试查找 Math::BigInt::Foo,然后查找 Math::BigInt::Bar,如果仍然失败,则恢复为 Math::BigInt::Calc

use Math::BigFloat lib => "Foo,Math::BigInt::Bar";

有关更多详细信息,请参阅各个底层库文档。

请参阅 Math::BigInt,了解有关使用其他底层库的更多详细信息。

使用 Math::BigInt::Lite

出于向后兼容性的原因,仍然可以请求不同的存储类以与 Math::BigFloat 一起使用

use Math::BigFloat with => 'Math::BigInt::Lite';

但是,此请求将被忽略,因为当前代码现在使用底层数学库直接存储数字部分。

导出

Math::BigFloat 默认情况下不导出任何内容,但可以导出 bpi() 方法

use Math::BigFloat qw/bpi/;

print bpi(10), "\n";

注意事项

不要尝试在切换库时插入一些操作

require Math::BigFloat;
my $matter = Math::BigFloat->bone() + 4;    # load BigInt and Calc
Math::BigFloat->import( lib => 'Pari' );    # load Pari, too
my $anti_matter = Math::BigFloat->bone()+4; # now use Pari

这将创建存储在两个不同后端库中的数字的对象,当你将它们一起使用时,将会发生非常糟糕的事情

my $flash_and_bang = $matter + $anti_matter;    # Don't do this!
字符串化,bstr()

stringify 和 bstr() 现在都将丢弃前导的“+”。旧代码将返回“+1.23”,新代码返回“1.23”。请参阅 Math::BigInt 中的文档以了解推理和详细信息。

brsft()

以下内容可能不会打印出你期望的内容

my $c = Math::BigFloat->new('3.14159');
print $c->brsft(3,10),"\n";     # prints 0.00314153.1415

它打印商和余数,因为 print 在列表上下文中调用 brsft()。此外,$c->brsft() 将修改 $c,所以请小心。您可能希望使用

print scalar $c->copy()->brsft(3,10),"\n";
# or if you really want to modify $c
print scalar $c->brsft(3,10),"\n";

代替。

修改和 =

注意

$x = Math::BigFloat->new(5);
$y = $x;

它不会执行您认为它会执行的操作,例如复制 $x。相反,它只会对同一对象进行第二次引用,并将其存储在 $y 中。因此,修改 $x 的任何操作都会修改 $y(重载的数学运算符除外),反之亦然。有关详细信息以及如何避免这种情况,请参阅 Math::BigInt

precision() 与 accuracy()

一个常见的陷阱是在您希望将结果四舍五入到一定位数时使用 "precision()"

use Math::BigFloat;

Math::BigFloat->precision(4);           # does not do what you
                                        # think it does
my $x = Math::BigFloat->new(12345);     # rounds $x to "12000"!
print "$x\n";                           # print "12000"
my $y = Math::BigFloat->new(3);         # rounds $y to "0"!
print "$y\n";                           # print "0"
$z = $x / $y;                           # 12000 / 0 => NaN!
print "$z\n";
print $z->precision(),"\n";             # 4

"accuracy()" 替换 "precision()" 可能也不是您想要的

use Math::BigFloat;

Math::BigFloat->accuracy(4);          # enables global rounding:
my $x = Math::BigFloat->new(123456);  # rounded immediately
                                      #   to "12350"
print "$x\n";                         # print "123500"
my $y = Math::BigFloat->new(3);       # rounded to "3
print "$y\n";                         # print "3"
print $z = $x->copy()->bdiv($y),"\n"; # 41170
print $z->accuracy(),"\n";            # 4

您希望改用

use Math::BigFloat;

my $x = Math::BigFloat->new(123456);    # no rounding
print "$x\n";                           # print "123456"
my $y = Math::BigFloat->new(3);         # no rounding
print "$y\n";                           # print "3"
print $z = $x->copy()->bdiv($y,4),"\n"; # 41150
print $z->accuracy(),"\n";              # undef

除了计算您预期之外,最后一个示例不会使用精度或精度设置“污染”结果,这会影响任何进一步的操作。

错误

请将任何错误或功能请求报告给 bug-math-bigint at rt.cpan.org,或通过 https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigInt 上的 Web 界面(需要登录)进行报告。我们会收到通知,然后当您进行更改时,您会自动收到有关错误的进度通知。

支持

您可以使用 perldoc 命令查找此模块的文档。

perldoc Math::BigFloat

您还可以在以下位置查找信息

许可证

此程序是免费软件;您可以在与 Perl 自身相同的条款下重新分发或修改它。

另请参阅

Math::BigIntMath::BigInt 以及后端 Math::BigInt::FastCalcMath::BigInt::GMPMath::BigInt::Pari

语用 bignumbigintbigrat

作者