提问人:Tomaz 提问时间:3/26/2023 最后编辑:MvGTomaz 更新时间:4/2/2023 访问量:117
用非常接近 1 的数字计算 atanh
Calculate atanh with numbers very close to 1
问:
我需要非常精确地计算反双曲正切。所讨论的等式是 where 应该在 240 的量级,并返回近似值 -276.65。-atanh(1/ (1 + 10**-x))
x
我尝试了 python 提供的一些库,例如 numpy、math 和 mpmath,但是,我可以使用的最大“x”值是 17。对于大于 17 的“x”,我收到 -inf 或域错误。
答:
2赞
MvG
3/26/2023
#1
您所需要的只是 https://en.wikipedia.org/wiki/Hyperbolic_functions。
你有但是.所以代替你可以写.tanh(x) = sinh(x)/cosh(x)
coth(x) = cosh(x)/sinh(x)
artanh(1/(1+ε))
arcoth(1+ε)
然后你可以用对数来表示。在维基百科上,您可以找到.所以成为.arcoth(x) = ½ ln((x+1)/(x-1))
arcoth(1+ε)
½ ln((2+ε)/ε)
这是你可以输入到 Python 中的东西。记住你在整个表达式前面有一个负号,你可以把它写成
eps = 10**(-x) # e.g. eps = 1e-240
res = -0.5 * math.log((2 + eps)/eps)
如果 eps 和你指示的一样小,分子将四舍五入,但分母应该有足够的精度来使整个事情正常工作。它适用于您的示例:我得到了正确的结果更像(在 Sage 中使用计算以获得数字误差的保证),因此我们从双精度算术中获得的所有数字都几乎是正确的。2
-276.6567847495655
-276.65678474956545473686759
RealIntervalField(1024)
评论
x = 240
-atanh(1/ (1 + 10**-x))
ValueError: math domain error), not
10**-240
小于 ,这意味着您的分母将是 1。sys.float_info.epsilon