Если вы берете число, берете его квадратный корень, отбрасываете десятичную дроби, а затем поднимаете его на вторую мощность, результат всегда должен быть меньше или равен исходному числу.
Это похоже на правду в python, пока вы не попробуете его по 99999999999999975425
по какой-либо причине.
import math
def check(n):
assert math.pow(math.floor(math.sqrt(n)), 2) <= n
check(99999999999999975424) # No exception.
check(99999999999999975425) # Throws AssertionError.
Похоже, что math.pow(math.floor(math.sqrt(99999999999999975425)), 2)
возвращает 1e+20
.
Я предполагаю, что это имеет какое-то отношение к тому, как мы храним значения в python... что-то связано с арифметикой с плавающей запятой, но я не могу объяснить, как конкретно это влияет на этот случай.