我正在编写一个使用简单神经网络感知算法的程序,当我这样做时,我有做负浮动算术的问题
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,我很困惑,因为地狱
答案 0 :(得分:3)
为什么我的数字,如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程序将不会对在控制台上获得的答案给出不同的答案。
因此,我认为如果仔细检查,您会发现程序中使用的值与控制台上使用的值略有不同。你给出的数字计算确实会返回零,所以我认为你会发现程序中使用的数字并不是你认为的那么多。
所有相同的,浮点并不准确。它仅对有限精度是准确的。一旦开始执行算术运算,您应该将其与指定的公差进行比较,而不是精确。要测试零,您应该检查结果的绝对值是否小于您选择的某个小值。