我在Perl中遇到了一个奇怪的行为。下面的减法应产生零结果(它在Python做):科学记数法是否会影响Perl的精度?
print 7.6178E-01 - 0.76178
-1.11022302462516e-16
它为什么会发生,以及如何避免呢?
P.S.效果出现在“用于x86_64-linux-gnu-thread-multi的v5.10.0”(Ubuntu 9.04)和“用于darwin-2级别的v5.8.9”(Mac OS 10.6)
我在Perl中遇到了一个奇怪的行为。下面的减法应产生零结果(它在Python做):科学记数法是否会影响Perl的精度?
print 7.6178E-01 - 0.76178
-1.11022302462516e-16
它为什么会发生,以及如何避免呢?
P.S.效果出现在“用于x86_64-linux-gnu-thread-multi的v5.10.0”(Ubuntu 9.04)和“用于darwin-2级别的v5.8.9”(Mac OS 10.6)
这不是科学记数法影响精度非常高,以二进制表示浮点符号的限制。请参阅perlfaq4的答案。对于任何依赖底层架构进行号码存储的语言来说,这都是一个问题。
如果你需要更好的数字处理,检查出bignum编译。
适用于我,我得到0(v5.8.8,Mac OSX)。 – 2010-01-13 12:57:25
我在这台机器上有两个Perls--一个5.8.8的本地版本,能够正常工作,另一个来自内置的版本 - 展示你的问题。 – 2010-01-13 13:36:30
发生在5.10.1,MSWin32-x86-多线程(Strawberry Perl 5.10.1.0)。 – 2010-01-13 20:53:49