Ich versuche, die größte Kubikwurzel zu finden, die eine ganze Zahl ist, also weniger als 12.000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
Ich bin mir nicht sicher, wie ich überprüfen soll, ob es sich um eine ganze Zahl handelt oder nicht! Ich könnte es in einen String konvertieren und dann mithilfe der Indizierung die Endwerte überprüfen und feststellen, ob sie Null sind oder nicht, was jedoch ziemlich umständlich erscheint. Gibt es einen einfacheren Weg?
python
floating-point
Chopper Draw Lion4
quelle
quelle
Antworten:
Verwenden Sie die folgende
float.is_integer()
Methode , um zu überprüfen, ob ein Gleitkommawert eine ganze Zahl ist :Die Methode wurde dem
float
Typ in Python 2.6 hinzugefügt .Zu Berücksichtigen , dass in Python 2,
1/3
ist0
(Bodenteilung für ganzzahlige Operanden!), Und daß Gleitpunktarithmetik kann ungenau sein (afloat
ist eine Annäherung Binärbrüche verwenden, nicht eine genaue reelle Zahl). Wenn Sie jedoch Ihre Schleife ein wenig anpassen, erhalten Sie Folgendes:was bedeutet, dass alles über 3 Würfel (einschließlich 10648) aufgrund der oben genannten Ungenauigkeit verpasst wurde:
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 von12000
: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:Für ältere Versionen die naive Implementierung dieser Funktion (Überspringen der Fehlerprüfung und Ignorieren von Unendlichkeit und NaN), wie in PEP485 erwähnt :
quelle
True
wenn überhaupt keine Dezimalstellen vorhanden sind. Natürlich kann es seitens des OP zu Missverständnissen hinsichtlich Gleitkomma-Arithmetik und Präzision kommen.1.0000000000000001
wird angezeigt als1.0
, in 3 wird die kürzeste Zeichenfolgendarstellung angezeigt , die denselben Wert erzeugt.range(12000, -1, -1)
könnte (imo, sauberer) umgeschrieben werden alsreversed(range(12000+1))
Wir können den Modulo (%) -Operator verwenden. Dies sagt uns, wie viele Reste wir haben, wenn wir x durch y teilen - ausgedrückt als
x % y
. Jede ganze Zahl muss durch 1 geteilt werden. Wenn es also einen Rest gibt, darf es keine ganze Zahl sein.Diese Funktion gibt einen Booleschen Wert zurück
True
oderFalse
, je nachdem, obn
es sich um eine ganze Zahl handelt.quelle
Sie könnten dies verwenden:
quelle
.is_integer()
weiter funktioniert.is_integer
verwendet eine ähnliche Methode (o = (floor(x) == x) ? Py_True : Py_False;
). Aber ich stimme zu, man sollte es verwenden,is_integer()
da es viel klarer ist.large_float == large_int
auch wenn er ausfälltlarge_float == float(large_int)
.123456789012345678901234567890.0 != 123456789012345678901234567890
aber123456789012345678901234567890.0 == float(123456789012345678901234567890)
k = 123456789012345678901234567890.0
dannk == int(k)
ist es wahr, was die richtige Antwort ist.Sie müssen nichts schleifen oder überprüfen. Nehmen Sie einfach eine Kubikwurzel von 12.000 und runden Sie sie ab:
quelle
Sie können dafür eine Modulo- Operation verwenden.
quelle
n
6.2, 6.0, 6.12312412 ist, haben wir alle"We have a decimal number here!"
?Wäre es nicht einfacher, die Kubikwurzeln zu testen? Beginnen Sie mit 20 (20 ** 3 = 8000) und gehen Sie bis zu 30 (30 ** 3 = 27000). Dann müssen Sie weniger als 10 Ganzzahlen testen.
quelle
n**(1/3)
Ganzzahl die Zahl übersehen können . Zum Beispiel auf meinem Computer `10648 ** (1/3) = 21.999999999999996` statt22
: Problem! Mit der Methode dieser Antwort gibt es kein solches Problem. Ich denke, dies ist aus mathematischer Sicht die einzig richtige Lösung (andere Lösungen sind Python-korrekt).Wie wäre es mit
quelle
Die obigen Antworten funktionieren in vielen Fällen, aber sie vermissen einige. Folgendes berücksichtigen:
Wenn Sie dies als Benchmark verwenden, erhalten einige der anderen Vorschläge nicht das gewünschte Verhalten:
Versuchen Sie stattdessen:
jetzt bekommen wir:
isclose
kommt mit Python 3.5+ und für andere Pythons können Sie diese meist äquivalente Definition verwenden (wie im entsprechenden PEP erwähnt ).quelle
math.fsum([0.1] * 10) == 1
Nur eine Nebeninfo,
is_integer
macht intern:quelle
Alle Antworten sind gut, aber eine sichere Feuermethode wäre
Die Funktion gibt True zurück, wenn es sich um eine ganze Zahl handelt. False .... Ich weiß, dass ich etwas spät dran bin, aber hier ist eine der interessanten Methoden, die ich gemacht habe ...
Bearbeiten: Wie im Kommentar unten angegeben, wäre ein billigerer gleichwertiger Test:
quelle
n % 1 == 0
. In diesem Fall führen Sie zwei Operationen aus, die für einen günstigeren äquivalenten Test teurer sind.quelle
Versuchen Sie es mit:
Es gibt viel mehr Präzision als alle anderen Methoden.
quelle
Du kannst den ... benutzen
round
Funktion den Wert berechnen.Ja, in Python haben viele darauf hingewiesen, dass wir bei der Berechnung des Werts einer Kubikwurzel eine Ausgabe mit ein wenig Fehler erhalten. Um zu überprüfen, ob der Wert eine ganze Zahl ist, können Sie die folgende Funktion verwenden:
Aber denken Sie daran, das
int(n)
ist gleichbedeutend mitmath.floor
und aus diesem Grund, wenn Sie die findenint(41063625**(1.0/3.0))
erhalten Sie 344 statt 345, .int
Seien Sie also bitte vorsichtig, wenn Sie mit den Kubikwurzeln arbeiten.quelle