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 в проекте Эйлера

В целом это может быть плохой стратегией, потому что числа очень велики, но все равно интересно, что делать конкретно с эта проблема с большими числами.
Полный код ниже. Я попробовал импортировать 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 failing 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
Мобильная версия