Wie berechne ich die Quadratwurzel in Python?


140

Warum gibt Python die "falsche" Antwort?

x = 16

sqrt = x**(.5)  #returns 4
sqrt = x**(1/2) #returns 1

Ja, ich weiß import mathund benutze sqrt. Aber ich suche nach einer Antwort auf das oben Gesagte.


31
Versuchen Sie es in Python 3, es ist behoben;)
Mark Ransom

2
Berechnen Sie eine Quadratwurzel in Python mit import mathund dann, x = math.sqrt(25)die den Wert 5.0x zuweist.
Eric Leschinski

1
@Merlin - Bitte setzen Sie die Änderungen am Titel nicht zurück. Es macht die Frage leichter zu finden.
ChrisF

2
@ ChrisF - es ist meine Frage, spricht mehrere Probleme an. Hören Sie auf, Titel und Inhalt zu ändern.
Merlin

Antworten:


246

sqrt=x**(1/2)macht Integer Division. 1/2 == 0.

Sie berechnen also in erster Linie x (1/2), in zweiter Linie x (0) .

Es ist also nicht falsch, es ist die richtige Antwort auf eine andere Frage.


64
"Es ist also nicht falsch, es ist die richtige Antwort auf eine andere Frage" - liebe es! - denke, ich könnte mich herausfordern, diesen Satz öfter zu verwenden!
Thomas Kimber

6
In Python 3.6 erhalten Sie die richtige Antwort auf die Frage, die Sie zuerst gestellt haben.
Vwvan

2
Die zweite Methode kann berechnet werden als:sqrt = x**(float(1)/2)
VM_AI

117

Sie müssen schreiben: sqrt = x**(1/2.0)Andernfalls wird eine Ganzzahldivision durchgeführt und der Ausdruck wird 1/2zurückgegeben 0.

Dieses Verhalten ist in Python 2.x "normal", während in Python 3.x Folgendes 1/2ausgewertet wird 0.5. Wenn Sie Ihren Python 2.x Code wollen wie 3.x WRT Division schreiben verhalten from __future__ import division- dann 1/2wird bewerten , um 0.5und für die Abwärtskompatibilität, 1//2wird zu prüfen , zu 0.

Für die Aufzeichnung ist die bevorzugte Methode zur Berechnung einer Quadratwurzel folgende:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

Es ist eine triviale Ergänzung der Antwortkette. Da das Thema jedoch ein sehr häufiger Google-Hit ist, sollte es meiner Meinung nach hinzugefügt werden.


11

/ führt in Python 2 eine Ganzzahldivision durch:

>>> 1/2
0

Wenn eine der Zahlen ein Float ist, funktioniert sie wie erwartet:

>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0

7

Was Sie sehen, ist die Ganzzahldivision. Um standardmäßig eine Gleitkommadivision zu erhalten,

from __future__ import division

Oder Sie können 1 oder 2 von 1/2 in einen Gleitkommawert umwandeln.

sqrt = x**(1.0/2)

2

Die Antwort mag etwas spät sein, aber die einfachste und genaueste Methode zur Berechnung der Quadratwurzel ist die Newton-Methode.

Sie haben eine Zahl, deren Quadratwurzel (num)Sie berechnen möchten, und Sie haben eine Vermutung 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 Linie berechnet eine genauere Schätzung mit diesen beiden Parametern. Sie können den Wert new_estimate an die Funktion übergeben und einen anderen Wert new_estimate berechnen, der genauer als der vorherige ist, oder Sie können eine rekursive Funktionsdefinition wie diese erstellen.

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 Quadratwurzel der 30er Jahre finden. Wir wissen, dass das Ergebnis zwischen 5 und 6 liegt.

newtons_method(30,5)

Die Nummer ist 30 und die Schätzung ist 5. Das Ergebnis jedes rekursiven Aufrufs ist:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

Das letzte Ergebnis ist die genaueste Berechnung der Quadratwurzel der Zahl. Dies ist der gleiche Wert wie die integrierte Funktion math.sqrt ().


1

Vielleicht eine einfache Möglichkeit, sich zu erinnern: Fügen Sie nach dem Zähler (oder Nenner) einen Punkt ein.

16 ** (1. / 2)   # 4
289 ** (1. / 2)  # 17
27 ** (1. / 3)   # 3

0

Mit NumPy können Sie Quadratwurzeln von Arrays berechnen:

 import numpy as np
 np.sqrt([1, 4, 9])

1
Dies ist ein natürlicherer Weg, um Quadratwurzeln zu machen, aber wie beantwortet es die Frage (zugegebenermaßen beantwortet es die Frage im Titel, aber nicht die eigentliche Frage im Körper (ja, es ist ein schlechter Titel))?
Peter Mortensen

-1

Ich hoffe, der unten genannte Code wird Ihre Frage beantworten.

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) 

Bitte bearbeiten Sie und fügen Sie eine kurze Erklärung hinzu, warum dies funktioniert. Nur der Code ist nicht sehr hilfreich.
Wjandrea
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.