2010-01-13 83 views
2

我在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)

+0

适用于我,我得到0(v5.8.8,Mac OSX)。 – 2010-01-13 12:57:25

+1

我在这台机器上有两个Perls--一个5.8.8的本地版本,能够正常工作,另一个来自内置的版本 - 展示你的问题。 – 2010-01-13 13:36:30

+0

发生在5.10.1,MSWin32-x86-多线程(Strawberry Perl 5.10.1.0)。 – 2010-01-13 20:53:49

回答

8

这不是科学记数法影响精度非常高,以二进制表示浮点符号的限制。请参阅perlfaq4的答案。对于任何依赖底层架构进行号码存储的语言来说,这都是一个问题。

如果你需要更好的数字处理,检查出bignum编译。

+0

好吧,使用bignum就可以了。但是,无论二进制表示问题如何,我都拒绝接受这种行为。任何其他语言都可以正确处理。 – Simon 2010-01-13 14:43:43

+0

并非所有语言的商店数字都一样,我也没有说任何有关它的正常情况。 – 2010-01-13 14:46:49

+2

Simon - 至少在某些特定情况下,没有演示这类问题的任何语言都不是使用CPU浮点指令,或者没有正确处理浮点数。不幸的是,数字的不正确处理是相对正常的(就基数为10的小数和浮点数之间的转换而言,这是非常正常的)。 – Vatine 2010-01-13 15:00:15