2012-03-18 40 views
0

更新:謝謝你們,我沒有意識到它非常接近於零,但不完全爲零。有沒有辦法繞過它,所以我的程序將其視爲零?它拋出我的結果,因爲這個值沒有被拾取爲零。 UPDATE2:想通了,並說:數學結果應該爲零,但與直接替換相比略有偏差

from decimal import * 
getcontext().prec = 6 

,然後十進制(數字)固定it.Thanks大家!

我正在運行一段簡單的代碼,但得到一個奇怪的結果與一個特定的數字。它有點奇怪,因爲當我在python終端運行相同的命令時,我得到了我期望的結果。

我做了打印語句,它的命令運行,所以我可以複製/粘貼它在解釋器(python 2.7),看看結果是否相同。這裏的程序:

x = 20 
for s in range(100 + 1): 
    for c in range(100+1): 
     if s == 7: 
      print s, '-', (c*0.01), '*', x, ' = ', (s - (c*0.01) * x) 

結果看起來不錯,除了一個:

7 - 0.33 * 20 = 0.4 
7 - 0.34 * 20 = 0.2 
7 - 0.35 * 20 = -8.881784197e-16 
7 - 0.36 * 20 = -0.2 
7 - 0.37 * 20 = -0.4 

當我複製/粘貼7 - 0.35 * 20到解釋我得到0.0這正是我希望(在程序中的其他結果看似正常,但7 - 0.35 * 20和(未顯示)與14

我有點難倒了,我不是在這裏嗎類似的值

+0

它被稱爲*解釋器*,而不是中斷者。 =) – ninjagecko 2012-03-18 16:47:49

+0

@ninjagecko對不起,safari autocorrected我:-( – 2012-03-18 17:09:26

回答

4

有交互式解釋和程序的輸出之間沒有什麼區別,但你給它不同的輸入。觀察:

>>> print 7 - 0.35 * 20 
0.0 
>>> print 7 - 35 * 0.01 * 20 
-8.881784197e-16 

而且,正如其他人已經注意到的,是由於舍入誤差。

+0

有沒有一種方法,我可以在我的程序中解決這個問題?基本上我檢查0,但-8.881784197e-16不被視爲0我的if語句。 – 2012-03-18 17:10:32

+0

我更新了我的答案,我找到了答案,我可以設置精度。 – 2012-03-18 17:23:49

+0

@learningJava你的「修復」並不是真正的解決方法 - 你只需四捨五入到小數點後六位,因爲沒有什麼可以解決的,因爲這不是一個錯誤! – katrielalex 2012-03-18 17:30:35

1

-8.881784197e-16(-8.8 * 10 ^( - 16))非常非常接近於0.您正在經歷浮點精度錯誤。

這是因爲你不是真的在做7 - 0.35 * 20像你認爲的那樣。您正在打印35 * 0.01,看起來像0.35,但不是。

>>> 7 - (0.35 * 20) 
0 

>>> 7 - (35*0.01 * 20) 
-8.881784197001252e-16 

>>> 35*0.01 
0.35000000000000003 
3

您已經發現(IEEE 754)浮點數學的不精確性質。您計算的結果非常接近於零,但並不完全爲零,因爲微處理器通常以一種爲速度和緊湊型存儲等其他好事犧牲精度的方式進行浮點運算。

如何打印這個非常接近零的值可能取決於您使用的非交互式Python版本(也是2.7?)。

2

你應該決定你接近零的數量是多少,然後檢查一下。

>>> import numpy as np 
>>> is_float_zero = lambda x, eps=np.finfo(float).eps: np.abs(x) < eps 
>>> is_float_zero(1e-10) 
False 
>>> is_float_zero(1e-20) 
True 

eps是浮點數的精度。你會想要增加這取決於你在這個數字上做了多少處理。順便說一下,設置小數點精度爲6,拋開很多準確性!