我需要非常精确地计算反正切值。有问题的等式是
-atanh(1/ (1 + 10**-x))
其中 x
应该是 240 的量级并返回 -276.65 的近似值。
我尝试了 python 提供的一些库,例如 numpy、math 和 mpmath,但是,我可以使用的最大“x”值是 17。对于大于 17 的“x”,我得到 -inf。
所有你需要的都在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 中计算以获得数字错误的保证)所以我们从双精度算术得到的所有数字是非常正确。