在Java中使用BigDecimal而不是double的权衡

时间:2009-12-29 04:12:18

标签: java neural-network double-precision

我正在为神经网络编写代码,我想知道我是否应该这样做。我实际上有点担心即使使用double也可能无法获得良好的结果,而且我可能必须将我的代码迁移到更有效的语言,比如c ++。我在这里读到一个问题,BigDecimal比double慢1000倍?那是很多。

另一方面,我将使用十进制数字进行大量工作,并且更精确地总是很好。我无法确定精度是否会导致问题。我不认为我所见过的任何实现都是这样做的,所以我可能不会这样做。虽然有时网络的行为不应该如此;无论这是精确错误还是逻辑问题,我都不确定。

但我想知道,你们在处理钱时只使用BigDecimal吗?有什么想法吗?

6 个答案:

答案 0 :(得分:4)

使用Java的double数据类型来表示神经网络中的权重似乎非常合适。它是工程和科学应用的理想选择。

神经网络本质上是近似的。 BigDecimal的精度在这个应用程序中毫无意义,除了性能影响之外。保留BigDecimal主要用于财务应用程序。

答案 1 :(得分:0)

我在处理钱时使用整数/长数,因为使用任何种类的十进制表示都是荒谬的。你应该绝对不要使用双打,并且你可能想要看一些处理库。

但我记得,钱库不成熟或不发达。

答案 2 :(得分:0)

整数和小数值的整数与货币相结合是可行的方法。找到一个图书馆或自己编写。

答案 3 :(得分:0)

您绝对不应将浮点十进制数用于固定点数 - 例如货币。

在过去,我使用了一个自定义Money类,它只包含一个BigDecimal实例 - 它运行良好且没有任何问题。

答案 4 :(得分:0)

只需使用BigDecimal / BigInteger来赚钱。相反,他们在需要比doublelong提供的精度更高的应用程序中使用它们。

当然,使用BigDecimalBigInteger是以更慢的算术运算为代价的。例如,大数字的加法为O(N),其中N是数字中的有效位数,乘法为O(N**2)

因此决定是否使用long / double或其“大”类比的方法是查看应用程序真正需要多少精度。资金申请确实需要能够代表价值而不会损失一分钱。其他应用对精度同样敏感。

但坦率地说,我不认为神经网络应用程序需要13个十进制数字的精度。您的网络不能正常运行的原因可能与精度无关。 IMO,它更可能与“真正的”神经网络并不总是以他们应该的方式行事有关。

答案 5 :(得分:-1)

做自己的基准测试并根据这个做出决定......这意味着没有“人们说什么”。