如何有效地计算指数函数的数字范围



我有一个指数函数x^n,其中x是0-1之间的数字,n是一个大整数(通常>100(。假设x和n用双精度数字表示时没有舍入误差。如何有效地计算x^n的数字范围?例如,我只想得到0.123^1000的小数点后两千位和第一位的数字。

我知道像MPFR这样的高精度库可以完美地完成这项工作,但它比双精度计算慢得多。由于我不需要一个数字中的所有数字,我正在寻找一种更有效的方法来做到这一点,但我对此一无所知。任何建议或提示都将不胜感激。

====================更新1====================

感谢大家的评论和回答,我注意到问题中的例子可能不合适,因为数字仍然不够小,不足以导致截断,所以我将其更改为0.123^1000。

对于那些喜欢看一些真实代码的人,我在R 中做了一个可复制的例子

x <- 0.123^1000
sprintf("%.10e",x)
y <- mpfr(0.123,precBits = 10000)^1000
y

x是一个双精度数字,结果为0,y是一个10000位的精度数字,可以实际显示小数点后第2001位的结果编号。注意,前几个(可能很多(有效数字通常不感兴趣,也就是说,如果指数函数的真实答案是0.123+4*10^10000,我会对"4"感兴趣,而不是1,2,3中的任何数字。这就是为什么高精度库在这里可能不合适,因为它会做很多不必要的计算。

您需要一个库来计算大整数。您可以使用此库和相应的计算来实现有理数。然后很容易获得有理数的任何十进制数字。看看Python中的代码示例。

如果你对有理数f的十进制数字d感兴趣,你可以计算f * 10^d,只使用它的整数部分,只取最低有效位。

import fractions
def get_digit(f, d):
f1 = f * 10**d
return (f1.numerator // f1.denominator) % 10
f = fractions.Fraction(123, 1000)
p = f ** 100
assert get_digit(p, 91) == 0
assert get_digit(p, 92) == 9
assert get_digit(p, 93) == 7
assert get_digit(p, 94) == 8
assert get_digit(p, 95) == 3
assert get_digit(p, 96) == 8

更新:

在计算过程中,第n位小数会受到所有低有效小数的影响。因此,无法直接计算第n位小数。必要的有效位数使双精度数据类型变得无用。因此,对大整数的计算是一个合理的实际折衷方案。

最新更新