浮动算术

时间:2011-11-21 13:02:29

标签: python floating-point

我正在编写一个使用简单神经网络感知算法的程序,当我这样做时,我有做负浮动算术的问题

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  如果我在python控制台中这样做一切都很好,但在程序中它给了我奇怪的价值。我实际打印每个值,它们都是正常的,但总结仍然很疯狂。

这里是完整代码http://tinypaste.com/1b8f9dd6,计算在第一个函数的顶部完成。

顺便说一句,我使用python 2.7,我很困惑,因为地狱

3 个答案:

答案 0 :(得分:3)

来自The Floating-Point Guide

  

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且   相反,我得到一个奇怪的结果,如0.30000000000000004?

     

因为在内部,计算机使用格式(二进制浮点)   它不能准确地表示0.1,0.2或0.3之类的数字。

     

编译或解释代码时,您的“0.1”已经存在   四舍五入到该格式的最接近的数字,这导致一个小的   甚至在计算发生之前就会出现舍入错误。

答案 1 :(得分:3)

数字-2.77555756156e-17-0.0000000000000000277555756156,正如你所知道的那样大约为0.显然你期望得到零,但浮点运算对大多数数字并不准确。这就是计算机数学运算的方式。

当然,如果您输入1.0 * 0.2 + 0.0 * 0.1 - 0.2,那么您会得到正确答案,但您的计划正在进行计算1 * 0.19999999999999998 + 1 * 0 - 0.20000000000000001

答案 2 :(得分:2)

如果对同一输入数据执行相同的计算,Python程序将不会对在控制台上获得的答案给出不同的答案。

因此,我认为如果仔细检查,您会发现程序中使用的值与控制台上使用的值略有不同。你给出的数字计算确实会返回零,所以我认为你会发现程序中使用的数字并不是你认为的那么多。

所有相同的,浮点并不准确。它仅对有限精度是准确的。一旦开始执行算术运算,您应该将其与指定的公差进行比较,而不是精确。要测试零,您应该检查结果的绝对值是否小于您选择的某个小值。