gpt4 book ai didi

java - 如何处理接近1的数的乘法

转载 作者:行者123 更新时间:2023-12-02 07:51:48 25 4
gpt4 key购买 nike

我有一堆 float (Java double ),其中大多数非常接近 1,我需要将它们相乘作为更大计算的一部分。我需要经常这样做。

问题是,虽然 Java double 对于以下数字没有问题:

0.0000000000000000000000000000000001 (1.0E-34)

它们不能代表如下内容:

1.0000000000000000000000000000000001

因此,我很快就失去了精度(对于 Java 的 double ,限制似乎约为 1.000000000000001)。

我考虑过只存储减去 1 的数字,因此例如 1.0001 将存储为 0.0001 - 但问题是要再次将它们相乘,我必须加 1,此时我失去了精度。

为了解决这个问题,我可以使用 BigDecimals 来执行计算(转换为 BigDecimal,加 1.0,然后乘法),然后再转换回 double ,但我非常担心这样做对性能的影响。

任何人都可以找到一种避免使用 BigDecimal 的方法吗?

为清楚起见进行编辑:这是针对大规模协作过滤器的,它采用梯度下降优化算法。准确性是一个问题,因为协同过滤器通常处理非常小的数字(例如,一个人点击产品广告的概率,可能是千分之一或万分之一)。

速度是一个问题,因为协同过滤器必须在数千万个数据点(甚至更多)上进行训练。

最佳答案

是的:因为

(1 + x) * (1 + y) = 1 + x + y + x*y

就您的情况而言,xy 非常小,因此 x*y 将会 较小 - 太小而无法影响计算结果。所以就你而言,

(1 + x) * (1 + y) = 1 + x + y

这意味着您可以存储减去 1 的数字,而不是相乘,只需将它们相加即可。只要结果始终远小于 1,它们就会足够接近数学上精确的结果,您不会关心其中的差异。

编辑:刚刚注意到:你说大多数都非常接近 1。显然,这种技术不适用于不接近 1 的数字 - 即是,如果xy很大。但如果一大一小,它可能仍然有效;你只关心乘积x*y的大小。 (如果两个数字都不接近 1,则可以使用常规 Java double 乘法...)

关于java - 如何处理接近1的数的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com