在浮点运算中查找小数点后的数字之和,直到任意精度



我正试图找到一个由分数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

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

传入字符串时,可能会返回NaN和Infinity的值,具体取决于底层的C库。Float接受字符串nan、inf和-inf表示nan和正或负无穷大。对于NaN,大小写和前导+被忽略,前导-被忽略。Float总是将NaN和无穷大表示为NaN、inf或-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,因此您现有的代码将不会运行。

此外,请注意,浮点计算无论如何都有局限性,所以对于如此高的精度来说,您的答案是不正确的。

因此,我建议你计算每轮除以分母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

最新更新