用非常小的数字计算反正切

问题描述 投票:0回答:1

我需要非常精确地计算反正切值。有问题的等式是

-atanh(1/ (1 + 10**-x))
其中
x
应该是 240 的量级并返回 -276.65 的近似值。

我尝试了 python 提供的一些库,例如 numpy、math 和 mpmath,但是,我可以使用的最大“x”值是 17。对于大于 17 的“x”,我得到 -inf。

python math precision
1个回答
0
投票

所有你需要的都在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 和你说的一样小,分子将四舍五入为

2
但分母应该有足够的精度来使整个事情正常进行。它适用于您的示例:我得到了
-276.6567847495655
,其中正确的结果更像是
-276.65678474956545473686759
(使用
RealIntervalField(1024)
Sage 中计算以获得数字错误的保证)所以我们从双精度算术得到的所有数字是非常正确。

© www.soinside.com 2019 - 2024. All rights reserved.