我有3个双打,我倍增。我可以用两种不同的方式做到这一点:
a. -1.0093674437739981 * 0.05521692677702658 * 0.04865764623936961
b. -1.0093674437739981 * (0.05521692677702658 * 0.04865764623936961)
我得到的答案是:
a. -0.0027118934413746733
b. -0.002711893441374673
我在第二个答案中丢失了一位数。
这怎么可能,有没有办法在不使用BigDecimal的情况下避免这种情况?
上下文是我以两种不同的方式实现了反向传播算法:
第一种算法通过网络递归递增并乘以所有项(权重* sigmoid-deriv * error-deriv)。
第二种算法使用矩阵。它首先计算第一层中的反向爬行,然后将其与第二层中的权重相乘(权重*(sigmoid-deriv * error-deriv)。当我这样做时,我失去了精度(如上所述)。
此实现不如第一次实现那样有效。
更新
我找到了一个关于神经网络的解决方案。如果算术引入了错误,则存储权重的完整尾数(存储以便读取权重以进行一些进一步的训练)并不是明智之举。最好将尾数限制为八位数,以避免下次出现错误。现在我的神经网络可以做多个时代而不是1。
答案 0 :(得分:0)
双打存储为尾数和指数的组合,您必须将尾数视为表示数字最高有效位的整数,并将指数视为有关小数点移位的信息。
如果你的两个操作数在指数中有较大的偏差(即1000.123 * 0.001000123对精度的影响大于1000.123 * 1000.123),那么在任何算术运算中你的不精确度都会更大。
在你的情况下,你将rougly -1乘以rougly 0.055,如果b你将0.055乘以0.048,这给你0.0026,而这又远离-1,所以从-1乘以0.0026的不精确是大。
你知道这是怎么回事,对吗?在这个级别上的Fiddeling不会比一开始就使用BigDecimal提供更快或更好的解决方案。