Warum gibt Python die "falsche" Antwort?
x = 16
sqrt = x**(.5)
returns 4
sqrt = x**(1/2)
returns 1
Ja, ich kenne import math
und verwende sqrt
. Aber ich suche nach einer Antwort auf das Obige.
sqrt=x**(1/2)
macht eine ganzzahlige Division. 1/2 == 0
.
Sie berechnen also x(1/2) in der ersten Instanz x(0) in der zweiten.
Es ist also nicht falsch, es ist die richtige Antwort auf eine andere Frage.
Sie müssen schreiben: sqrt = x**(1/2.0)
, andernfalls wird eine Ganzzahldivision ausgeführt und der Ausdruck 1/2
gibt 0
zurück.
Dieses Verhalten ist "normal" in Python 2.x, wohingegen in Python 3.x 1/2
zu 0.5
ausgewertet wird. Wenn Sie möchten, dass sich Ihr Python 2.x-Code wie 3.x w.r.t verhält. Division schreiben from __future__ import division
- dann wird 1/2
zu 0.5
ausgewertet und aus Gründen der Rückwärtskompatibilität 1//2
eill zu 0
.
Die bevorzugte Methode zur Berechnung einer Quadratwurzel ist folgende:
import math
math.sqrt(x)
import math
math.sqrt( x )
Es ist eine triviale Ergänzung der Antwortkette. Da das Thema jedoch ein sehr häufiger Google-Treffer ist, ist dies meiner Meinung nach verdient.
/
führt eine ganzzahlige Division in Python 2 durch:
>>> 1/2
0
Wenn eine der Zahlen ein Float ist, funktioniert es wie erwartet:
>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0
Was Sie sehen, ist eine Ganzzahlteilung. Um standardmäßig eine Gleitkommadivision zu erhalten,
from __future__ import division
Oder Sie können 1 oder 2 von 1/2 in einen Gleitkommawert konvertieren.
sqrt = x**(1.0/2)
Dies kann etwas spät sein, aber die einfachste und präziseste Methode zur Quadratwurzelberechnung ist die Newton-Methode.
Sie haben eine Zahl, deren Quadratwurzel (num)
Sie berechnen möchten, und Sie haben eine Schätzung der Quadratwurzel (estimate)
. Die Schätzung kann eine beliebige Zahl größer als 0 sein, aber eine sinnvolle Zahl verkürzt die rekursive Anruftiefe erheblich.
new_estimate = (estimate + num / estimate) / 2
Diese Zeile berechnet mit diesen beiden Parametern eine genauere Schätzung. Sie können den Wert new_estimate an die Funktion übergeben und ein anderes new_estimate berechnen, das genauer ist als der vorherige, oder Sie können eine solche rekursive Funktionsdefinition vornehmen.
def newtons_method(num, estimate):
# Computing a new_estimate
new_estimate = (estimate + num / estimate) / 2
print(new_estimate)
# Base Case: Comparing our estimate with built-in functions value
if new_estimate == math.sqrt(num):
return True
else:
return newtons_method(num, new_estimate)
Zum Beispiel müssen wir die 30-Quadratwurzel finden. Wir wissen, dass das Ergebnis zwischen 5 und 6 liegt.
newtons_method(30,5)
nummer ist 30 und Schätzung ist 5. Das Ergebnis von jedem rekursiven Aufruf ist:
5.5
5.477272727272727
5.4772255752546215
5.477225575051661
Das letzte Ergebnis ist die genaueste Berechnung der Quadratwurzel von number. Es ist derselbe Wert wie die eingebaute Funktion math.sqrt ().
Vielleicht eine einfache Möglichkeit, sich zu erinnern: Fügen Sie einen Punkt nach dem Zähler (oder Nenner) ein. * (1./3) # 3
Ich hoffe, dass der unten genannte Code Ihre Frage beantworten wird.
from __future__ import print_function
def root(x,a):
y = 1 / a
y = float(y)
print(y)
z = x ** y
print(z)
base = input("Please input the base value:")
power = float(input("Please input the root value:"))
root(base,power)