Нахождение суммы цифр после десятичной дроби до произвольной точности
Я пытаюсь найти сумму 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