Как бороться с большими числами и неточностями в Python?Python

Программы на Python
Ответить
Anonymous
 Как бороться с большими числами и неточностями в Python?

Сообщение Anonymous »

Пример:
i = 292893227695
j = 8*i**2 + 1
k = math.sqrt(j)
print(j)
print(k)
print(k.is_integer())

выдает результат
686291542636760920104201
828427149867.0
True

Несмотря на то, что k не является целым числом.
В более общем плане я пытаюсь решить задачу 100 в проекте Эйлера.

Если в коробке находится двадцать один цветной диск, состоящий из пятнадцати синих
дисков и шести красных дисков, и два диска были взяты наугад, можно
видеть, что вероятность взять два синих диска P(BB) = (15/21) x (14/20) = 1/2.
Следующая такая комбинация, для которой существует ровно 50% вероятность
наугад взять два синих диска, - это коробка, содержащая восемьдесят пять синих
дисков и тридцать пять красных дисков.
Найдя первую комбинацию, содержащую более 1012 = 1 000 000
000 000 дисков в общей сложности, определите количество синих дисков, которые
коробка будет содержать.

В целом это может быть плохой стратегией, поскольку числа очень велики, но все же интересно, что конкретно делать с этой проблемой с большими числами.
Полный код ниже. Я попробовал импортировать getcontext, но это ничего не изменило:
import math
from time import perf_counter
from decimal import Decimal, getcontext
getcontext().prec = 50

start = perf_counter()
n = 7 # question specifies 12 (10**12)
limit = 10**n # starts to slow at 7
startno = 1 #292893220000 #2.9*10**11
# squares = set()
# for i in range(1,limit):
# squares.add(i**2)
candidates = []
for i in range(startno,limit):
j = (8*i**2 + 1)
k = math.sqrt(j)
if k.is_integer() == True:
b = ((2*i + 1) + k ) / 2
candidates.append((b,i))
print(b,i,b/(b+i))
if b + i > 10**12 and b.is_integer() == True:
print(b,i)
break

# print(candidates)
# print(len(squares))
end = perf_counter()
print(end-start, n)

# need to find some way to find the answers. These methods all fail due to rounding in Python

print(math.sqrt(285700000000))
i = 292893227695
j = 8*i**2 + 1
print(j)
k = math.sqrt(j)
print(k)
print(k.is_integer())


Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»