Verwenden Sie die folgende float.is_integer()
Methode , um zu überprüfen, ob ein Gleitkommawert eine ganze Zahl ist :
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
Die Methode wurde dem float
Typ in Python 2.6 hinzugefügt .
Zu Berücksichtigen , dass in Python 2, 1/3
ist 0
(Bodenteilung für ganzzahlige Operanden!), Und daß Gleitpunktarithmetik kann ungenau sein (a float
ist eine Annäherung Binärbrüche verwenden, nicht eine genaue reelle Zahl). Wenn Sie jedoch Ihre Schleife ein wenig anpassen, erhalten Sie Folgendes:
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
was bedeutet, dass alles über 3 Würfel (einschließlich 10648) aufgrund der oben genannten Ungenauigkeit verpasst wurde:
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
Sie müssten stattdessen nach Nummern suchen, die nahe an der gesamten Nummer liegen, oder sie nicht verwenden float()
, um Ihre Nummer zu finden. Als würde man die Kubikwurzel abrunden von 12000
:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Wenn Sie Python 3.5 oder höher verwenden, können Sie mit der math.isclose()
Funktion feststellen , ob ein Gleitkommawert innerhalb eines konfigurierbaren Bereichs liegt:
>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
Für ältere Versionen die naive Implementierung dieser Funktion (Überspringen der Fehlerprüfung und Ignorieren von Unendlichkeit und NaN), wie in PEP485 erwähnt :
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)