乘以双精度时精度损失

时间:2017-09-28 10:43:03

标签: java neural-network

我有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。

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提供更快或更好的解决方案。