gpt4 book ai didi

logarithm - 使用对数避免数值下溢的算术问题(取 2)

转载 作者:行者123 更新时间:2023-12-04 14:52:46 27 4
gpt4 key购买 nike

我有两个分数列表;

A = [ 1/212, 5/212, 3/212, ... ]
B = [ 4/143, 7/143, 2/143, ... ] .

如果我们定义 A' = a[0] * a[1] * a[2] * ...B' = b[0] * b[1] * b[2] * ...
我想计算 A' 和 B' 的归一化值

即特别是 A' / (A'+B') 的值和 B' / (A'+B')
我的问题是 A 和 B 都很长,每个值都很小,所以计算乘积会很快导致数值下溢......

我了解通过对数将乘积转化为总和可以帮助我确定 A' 或 B' 中的哪个更大

max( log(a[0])+log(a[1])+..., log(b[0])+log(b[1])+... )
并且使用日志我可以计算出 A' / B' 的值但我该怎么做 A' / A'+B'
迄今为止我最好的选择是将数字表示保留为分数,即 A = [ [1,212], [5,212], [3,212], ... ]并实现我自己的算术,但它变得笨拙,我觉得有一种(简单的)对数方式我只是想念......

A 和 B 的分子不是来自序列。对于这个问题,它们也可能是随机的。如果它有助于 A 中所有值的分母相同,那么 B 的所有分母也相同。

任何想法最受欢迎!

( ps。我在 24 小时前问了一个 similar question 关于比率 A'/B' 但这实际上是一个错误的问题。我实际上是在追求 A'/(A'+B') 。对不起,我的错误。)

最佳答案

我在这里看到几种方法

首先你可以注意到

A' / (A'+B') = 1 / (1 + B'/A')

你知道如何计算 B'/A'用对数。

另一种方法是实现你自己的有理算术,但你不需要走得太远。由于您知道整个数组的分母相同,因此它立即为您提供
numerator(A') = numerator(a[0]) * numerator(a[1]) ...
denumerator(A') = denumerator(a[0]) ^ A.length

您现在需要做的就是简单地将 A' 和 B' 相加,然后乘以 A'1/(A'+B')这也很容易。这里最难的部分是对结果值进行归一化,这是通过模运算完成的,而且是微不足道的。

或者,由于您很可能使用一些流行的脚本语言,它们中的大多数都内置了有理算术的类,Python 和 Ruby 肯定有它们。

关于logarithm - 使用对数避免数值下溢的算术问题(取 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293762/

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