Нахождение суммы цифр после десятичной дроби до произвольной точности

Я пытаюсь найти сумму 2000 десятичных цифр числа, созданного дробью, a/b, Я получаю много цифр, пока не нажму NaN (не номер). Я нажимаю NaN, когда цикл проходит около 310 раз. Как я могу получить остальные цифры?

Вот код, который я использую:

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 ответ

Решение

Вы используете неправильный подход. Использование прямого деления с плавающей точкой ограничивает вашу способность вычислять десятичные дроби, поскольку целые числа могут быть преобразованы в числа с плавающей запятой на основе базовых библиотек, как указано в документации, и по умолчанию число с плавающей запятой не будет сохранять числа с произвольной точностью (в вашем случае 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 или же inf и, следовательно, ваш существующий код не будет работать.

Кроме того, обратите внимание, что вычисления с плавающей точкой в ​​любом случае имеют ограничения, поэтому ваш ответ был бы неверным для такой высокой точности.

Поэтому вместо этого я предлагаю вам вычислять остаток в каждом повороте деления на знаменатель, 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
Другие вопросы по тегам