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 接受的任何内容作为字面数字常量,都应该被此模块接受。
忽略前导和尾随空格。
忽略前导零,二进制指数的浮点数除外,在这种情况下,该数字将被解释为八进制浮点数。例如,“01.4p+0”给出 1.5,“00.4p+0”给出 0.5,但“0.4p+0”给出 NaN。而“0377”给出 255,“0377p0”给出 255。
如果字符串有“0x”或“0X”前缀,则将其解释为十六进制数。
如果字符串有“0o”或“0O”前缀,则将其解释为八进制数。带有“0”前缀的浮点文字也解释为八进制数。
如果字符串有“0b”或“0B”前缀,则将其解释为二进制数。
下划线字符允许的方式与在文字数值常量中允许的方式相同。
如果无法解释字符串,则返回 NaN。
对于十六进制、八进制和二进制浮点数,指数必须用字母“p”或“P”与有效数字(尾数)分开,而不是十进制数的“e”或“E”。
有效字符串输入的一些示例
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 以获取每种方法的完整说明。以下是最重要的区别
$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
$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()” 设置舍入位置!
$x -> from_hex("0x1.921fb54442d18p+1");
$x = Math::BigFloat -> from_hex("0x1.921fb54442d18p+1");
将输入解释为十六进制字符串。前缀(“0x”、“x”,忽略大小写)是可选的。任何两个数字之间可以放置一个下划线字符(“_”)。如果输入无效,则返回 NaN。指数使用十进制数字以 2 为底。
如果作为实例方法调用,则该值将分配给调用者。
$x -> from_oct("1.3267p-4");
$x = Math::BigFloat -> from_oct("1.3267p-4");
将输入解释为八进制字符串。可以在任意两个数字之间放置一个下划线字符 (“_”)。如果输入无效,则返回 NaN。指数使用十进制数字以 2 为底。
如果作为实例方法调用,则该值将分配给调用者。
$x -> from_bin("0b1.1001p-4");
$x = Math::BigFloat -> from_bin("0b1.1001p-4");
将输入解释为十六进制字符串。前缀 (“0b” 或 “b”,忽略大小写) 是可选的。可以在任意两个数字之间放置一个下划线字符 (“_”)。如果输入无效,则返回 NaN。指数使用十进制数字以 2 为底。
如果作为实例方法调用,则该值将分配给调用者。
将输入解释为按照 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");
print Math::BigFloat->bpi(100), "\n";
计算 PI 至 N 位数字(包括小数点前的 3 位)。结果根据当前舍入模式进行舍入,该模式默认为 “even”。
此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。
$x->bmuladd($y,$z);
将 $x 乘以 $y,然后将 $z 加到结果中。
此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。
$q = $x->bdiv($y);
($q, $r) = $x->bdiv($y);
在标量上下文中,将 $x 除以 $y 并将结果返回到给定的或默认的精度/准确度。在列表上下文中,执行取整除(F 除法),返回一个整数 $q 和一个余数 $r,使得 $x = $q * $y + $r。余数(模)等于 $x->bmod($y)
返回的值。
$x->bmod($y);
返回 $x 模 $y。当 $x 为有限值,且 $y 为有限且非零值时,结果与取整除(F 除法)后的余数相同。此外,如果 $x 和 $y 都是整数,则结果与 Perl 的 % 运算符的结果相同。
$x->bexp($accuracy); # calculate e ** X
计算表达式 e ** $x
,其中 e
是欧拉数。
此方法在 Math::BigInt 的 v1.82 中添加(2007 年 4 月)。
$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 月)。
my $x = Math::BigFloat->new(1);
print $x->bsin(100), "\n";
计算 $x 的正弦,修改 $x。
此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。
my $x = Math::BigFloat->new(1);
print $x->bcos(100), "\n";
计算 $x 的余弦,修改 $x。
此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。
my $x = Math::BigFloat->new(1);
print $x->batan(100), "\n";
计算 $x 的反正切,修改 $x。另请参见 "batan2()"。
此方法在 Math::BigInt 的 v1.87 中添加(2007 年 6 月)。
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 月)。
当 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()
相同。
按照 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”。
另请参见:舍入。
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";
从“.” 向左舍入到第 $scale 位,从点开始计数。第一个数字编号为 1。
从“.” 向右舍入到第 $scale 位,从点开始计数。
舍入为整数。
保留从左侧开始的 $scale 位的精度(又称有效位数),并用零填充其余部分。如果数字介于 1 和 -1 之间,则有效位数从“.”之后的第一个非零位开始计数。
这些实际上是无操作。
所有舍入函数都将以下内容之一作为第二个参数,作为舍入模式:'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
在 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::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!
stringify 和 bstr() 现在都将丢弃前导的“+”。旧代码将返回“+1.23”,新代码返回“1.23”。请参阅 Math::BigInt 中的文档以了解推理和详细信息。
以下内容可能不会打印出你期望的内容
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()"
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
您还可以在以下位置查找信息
GitHub
RT:CPAN 的请求跟踪器
MetaCPAN
CPAN 测试人员矩阵
CPAN 评级
Bignum 邮件列表
发布到邮件列表
bignum at lists.scsys.co.uk
查看邮件列表
订阅/取消订阅
此程序是免费软件;您可以在与 Perl 自身相同的条款下重新分发或修改它。
Math::BigInt 和 Math::BigInt 以及后端 Math::BigInt::FastCalc、Math::BigInt::GMP 和 Math::BigInt::Pari。
Mark Biggar,Ilya Zakharevich 的重载接口,1996-2001 年。
Tels http://bloodgate.com 在 2001-2008 年间彻底重写。
Florian Ragwitz <[email protected]>,2010 年。
Peter John Acklam <[email protected]>,2011 年至今。