2016-12-14 5 views
0

Warum endet der folgende Code nicht?Berechnung der Quadratwurzel von 2

# approximating sqrt(2) 

def approx (error,left, right): 
    c = (left+right)/2 
    f = c**2 - 2 

    if abs(f)<error : 
     return c 

    if f < 0: 
     left = c 
    else: 
     right = c 

    return approx(error,left,right) 

print approx(0.1,0,2) 
+0

Versuchen Sie mit Ihrem Debugger: Schritt durch den Code und sehen, was passiert. – Blorgbeard

+0

Außerdem: Hier ist keine Rekursion erforderlich. Setzen Sie den Code einfach in 'while True:'. – Blorgbeard

Antwort

3

Sie könnten Präzision auf dieser Linie zu verlieren:

c = (left+right)/2 

wenn left und right beide ganze Zahlen sind, dann c wird auch eine ganze Zahl sein. Dies führt zu unerwartetem Verhalten, z. B. 1/2 Auswertung zu 0.

können Sie das Ergebnis zwingen, einen Schwimmer zu sein, indem durch einen Schwimmer Dividieren:

c = (left+right)/2.0 

Oder Sie können zu Python 3.x wechseln und es wird automatisch gewöhnliche sinnvolle Aufteilung verwenden.

+0

Danke, das funktioniert. Das ist in der Tat etwas gegensätzlich. – Epsilon

+1

... oder einfach Abteilung von Zukunft importieren: https://www.python.org/dev/peps/pep-0238/ – danihp

+1

@Epsilon ganzzahlige Division Etagen das Ergebnis, das ist ein bisschen Standard-Programmiersprachen Verhalten –

Verwandte Themen