2010-01-13 24 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