Чтобы проверить, является ли значение с плавающей точкой целым числом, используйте float.is_integer()
метод :
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
Метод был добавлен в float
тип в Python 2.6.
Учтите, что в Python 2 1/3
есть 0
(деление по полу для целочисленных операндов!), И что арифметика с плавающей запятой может быть неточной (a float
- это приближение, использующее двоичные дроби, а не точное действительное число). Но немного подкорректировав цикл, вы получите:
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
Это означает, что что-либо более 3 кубов (включая 10648) было пропущено из-за вышеупомянутой неточности:
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
Вместо этого вам придется проверять номера, близкие к целому, или не использовать их float()
для поиска своего номера. Как округление корня куба 12000
:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Если вы используете Python 3.5 или новее, вы можете использовать math.isclose()
функцию, чтобы увидеть, находится ли значение с плавающей запятой в пределах настраиваемого поля:
>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
Для более старых версий наивная реализация этой функции (пропуск проверки ошибок и игнорирование бесконечности и NaN), как упомянуто в PEP485 :
def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)