2011-11-21 63 views
0

我寫它採用簡單的神經網絡感知算法的程序,我有做負的浮點數運算,當我做這個浮法算術

summ = x1*w1+x2*w2-t 

SUMM得到的-2.77555756156e-17

值這只是發生問題當 x1 = 1.0 w1 = 0.2 x2 = 0.0 w2 = 0.1 t=0.2 如果我這樣做的蟒蛇控制檯一切都很好,但在程序中它給了我奇怪的價值。我實際上打印了每個值,它們都是正常的,但仍然是最後的瘋狂。

這裏是完整的代碼http://tinypaste.com/1b8f9dd6計算是在頂部完成的,在第一個函數中完成。

順便說一句IM使用python 2.7,我很困惑,到底

回答

3

人數-2.77555756156e-17-0.0000000000000000277555756156,正如你可以告訴幾乎爲0顯然,你期待exatly爲零,但浮點運算是不準確的大多數號碼。這就是計算機的工作原理。

當然,如果你輸入1.0 * 0.2 + 0.0 * 0.1 - 0.2那麼你會得到正確的答案,但你的程序正在計算1 * 0.19999999999999998 + 1 * 0 - 0.20000000000000001

+0

是啊我現在明白了 – abdu

+0

如果程序執行與在控制檯執行相同的計算,那麼結果將是相同,並且兩者將完全爲零。 –

3

The Floating-Point Guide

爲什麼我的數字,像0.1 + 0.2加起來一個漂亮的圓0.3, 相反,我得到一個奇怪的結果,如0.30000000000000004?

由於內部計算機使用格式(二進制浮點數) ,因此無法準確表示數字,如0.1,0.2或0.3。

當代碼被編譯或解釋時,您的「0.1」已經被 舍入到該格式的最接近的數字,即使在計算髮生之前,這也會導致一個小的舍入誤差。

+0

該公式中的0.1乘以零,因此其表示形式無關緊要。 –

+0

@DavidHeffernan但是0.2 .. – Lipis

+2

@Lipis所提出的方程歸結爲1.0 * 0.2-0.2。1.0 *是無操作,因此它無論如何表示0.2,都會精確到0.2-0.2,這正好是零。 –

2

只要對相同的輸入數據執行相同的計算,Python程序將不會給出與控制檯獲得的答案不同的答案。

因此,我認爲如果仔細檢查,您會發現程序中使用的值與控制檯上使用的值略有不同。用你給出的數字計算確實會精確返回到零,所以我認爲你會發現程序中使用的數字並不完全相信它們。

完全相同,浮點數不確切。只有有限的精度纔是準確的。一旦開始執行算術,您應該將您的比較結果設置爲指定的容差,而不是精確的。要測試爲零,您應該檢查結果的絕對值是否小於您選擇的某個小值。