在浮点数中找到小数点后的数字总和,直到任意精度

finding sum of digits after decimal in a float till arbitary precision

我正在尝试求出一个由分数 a/b 组成的数字的 2000 位小数的总和。在我点击 NaN (不是数字)之前,我得到了很多数字。当循环运行大约 310 次时,我命中了 NaN。我如何获得其余的数字?

这是我使用的代码:

import math
a = 3.00
b = 857.00
c = a/b
result = 0.0
s = 0.0
for x in range(0, 2000 , 1):
    s= c % 10
    result += int(s)
    c *= 10

print result

您使用了错误的方法。使用直接浮点数除法会限制您计算小数的能力,因为可以根据基础库将整数转换为浮点数,如 mentioned in documentation,并且默认情况下浮点数不会将数字保存为任意精度(在您的情况下为 2000) :

When passing in a string, values for NaN and Infinity may be returned, depending on the underlying C library. Float accepts the strings nan, inf and -inf for NaN and positive or negative infinity. The case and a leading + are ignored as well as a leading - is ignored for NaN. Float always represents NaN and infinity as nan, inf or -inf.

在你的情况下(在我的情况下),这个限制恰好是 2**1024。转到 python 提示符,然后尝试 运行 执行以下操作:

>>> float(2**1024)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to float
>>> float(2**1023)
8.98846567431158e+307

上面的数字基本上对应于上面代码中 c 的值,在第 310 次迭代结束时,假设 c 被定义为 float,它会抛出错误。

基本上,这意味着任何 float 等于或大于 2 **1024 的数字将被转换naninf,因此您现有的代码不会 运行。

另外,请注意 floating point calculations have limitations anyway,因此对于如此高的精度,您的答案不会是正确的。

因此,我建议您计算每圈除以分母 b 的余数,如下所示:

a = 3
b = 857
result = 0
if a:
    for x in range(0, 2000 , 1):
        a = a*10
        result += a / b
        a = a%b    

>>> print result
9056