【发布时间】:2015-06-11 09:56:35
【问题描述】:
在一方面,我理解 Perl 的浮点数是不精确的二进制表示,这会导致 Perl 的数学有时是错误的。我不明白的是,为什么有时这些花车似乎给出了准确的答案,而其他时候却没有。 是否可以预测 Perl 的浮点数学何时会给出错误的答案(即不准确的答案)?
例如,在下面的代码中,当减法为“16.12 - 15.13”时,Perl 的数学错误 1 次,当问题为“26.12 - 25.13”时错误 2 次,当问题为“36.12”时错误 20 次- 35.13 英寸。此外,出于某种原因,在所有上述测试用例中,我们的减法问题(即 $subtraction_problem)的结果一开始是错误的,但随着我们从中添加或减去的越多(使用$x)。这是没有意义的,为什么我们在算术问题中添加或减去的越多,值就越有可能正确(即精确)?
my $subtraction_problem = 16.12 - 15.13;
my $perl_math_failures = 0;
for (my $x = -25; $x< 25; $x++){
my $result = $subtraction_problem +$x;
print "$result\n";
$perl_math_failures++ if length $result > 6;
}
print "There were $perl_math_failures perl math failures!\n";
【问题讨论】:
-
在我的脚本顶部尝试“使用 bignum”,这使得 Math::BigFloat 对象的数字为我解决了这个问题。
-
(在评论中回答,因为问题已作为重复关闭。)是的,可以预测何时会发生浮点异常,因为 IEEE 浮点表示是确定性的。
-
而且,Goldberg 经历了找出错误的细节。
标签: perl math binary decimal inexact-arithmetic