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

时间:2015-03-26 13:28:49

标签: python python-2.7 sum decimal modulus

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

1 个答案:

答案 0 :(得分:2)

您使用的是错误的方法。使用直接浮点除法限制了计算小数的能力,因为整数可以基于底层库转换为浮点数,如mentioned in documentation,并且默认情况下float不会将数字保存为任意精度(在您的情况下为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 数字都将转换为nan或{ {1}},因此您现有的代码无法运行。

另外,请注意floating point calculations have limitations anyway,所以你的答案对于如此高的精确度来说是不正确的。

相反,我建议你计算每个回合中的余数除以分母b,如下所示:

inf