Python verhindert Überlauffehler bei der Handhabung großer Gleitkommazahlen und Ganzzahlen

Ich arbeite an einem Python-Programm, um Zahlen in der Fibonacci-Sequenz zu berechnen . Hier ist mein Code:

import math def F(n): return ((1+math.sqrt(5))**n-(1-math.sqrt(5))**n)/(2**n*math.sqrt(5)) def fib(n): for i in range(n): print F(i) 

Mein Code verwendet diese Formel für die Suche nach der N-ten Zahl in der Fibonacci-Sequenz:

  • Berechnen der n-ten Fibonacci-Zahl unter Verwendung der Formeln in Python
  • Ein iterativer Algorithmus für Fibonacci-Zahlen
  • Nth Fibonacci Zahl für n so groß wie 10 ^ 19?
  • Fibonacci-Zahlen, mit einem Ein-Liner in Python 3?
  • Wie drucke ich eine Fibonacci-Sequenz auf die n-te Nummer in Python?
  • Fibonacci arbeitet in Python aber scheitert in Java
  • Bildbeschreibung hier eingeben

    Dies kann viele der Zahlen in der Fibonacci-Sequenz berechnen, aber ich bekomme Überlauffehler.

    Wie kann ich diesen Code verbessern und Überlauffehler verhindern?

    Hinweis: Ich verwende Python 2.7.

  • In Python, was bedeutet es, wenn ein Objekt ist abonnierbar oder nicht?
  • Was bedeutet Abstraktion in der Programmierung?
  • Was ist ein Affenflecken?
  • Python: Terminologie 'Klasse' VS 'Typ'
  • Python-Terminologie: Sachen nach links von "= argv" in Lernen Python die Hard Way-Übung 13
  • 4 Solutions collect form web for “Python verhindert Überlauffehler bei der Handhabung großer Gleitkommazahlen und Ganzzahlen”

    Ihre Aussage von Wie kann ich diesen Code verbessern … ist irgendwie vage, also werde ich es nehmen, um zu verkürzen Ihren Code:

     import math def fib(j): for i in [int(((1+math.sqrt(5))**n-(1-math.sqrt(5))**n)/(2**n*math.sqrt(5))) for n in range(j)]: print i 

    Sie können beide Funktionen kombinieren, um nur eine Funktion zu machen, und mit dem Listenverständnis können Sie diese Funktion in einer Zeile ausführen.

    Sie können keine Überlauffehler verhindern, wenn Sie mit sehr großen Zahlen arbeiten, stattdessen versuchen, sie zu fangen und dann zu brechen:

     import math def fib(j): try: for i in [int(((1+math.sqrt(5))**n-(1-math.sqrt(5))**n)/(2**n*math.sqrt(5))) for n in range(j)]: print i except Exception as e: print 'There was an error, your number was too large!' 

    Die zweite wird zuerst Schleife über alles und stellen Sie sicher, dass es keinen Fehler gibt, und wenn es nicht gibt, wird es fortfahren, es zu drucken.

    Ich weiß nicht, ob das für Sie akzeptabel ist, aber Sie können einfach eine Ganzzahl-Arithmetik verwenden, um die Fib-Zahl mit der Rekursionsrelation zu berechnen (zB F3 = F2 + F1).

    Seit Python 2.5 ?, können Sie beliebige Präzision integer Arithmetik – ziemlich viel beseitigen Überlaufprobleme – Wenn Sie versuchen, F (10000) zu berechnen, wird es zweifellos sehr langsam.

    Überprüfen Sie auch das dezimale Modul – IIRC korrekt, können Sie mit Python 2.7 verwenden, können Sie die Präzision der Dezimalarithmetik angeben – damit können Sie den gleichen Algorithmus fortsetzen – mit Ausnahme der Verwendung des Dezimaltyps.

    HINZUGEFÜGT

    Sie können leicht übersehen, dass die Dezimalklasse eine Quadratwurzelmethode enthält. Sie müssten diese Methode anstelle von math.sqrt () verwenden, da Sie die volle Präzision der Dezimalklasse beibehalten müssen.

    Auch sqrt (5) ist eine relativ teure Operation. Berechnen Sie es nur einmal

    Ein Python-Doppel hat einen begrenzten Wert. Aber ein int nicht:

     a,b,c=0,1,0 untill=int(raw_input("> ")) for i in range(0,untill): c=a+b print b a=b b=c 

    Kann für immer weitergehen, kann aber N nicht finden, ohne auch nur alle Nummern zu finden.

    Pythons Ganzzahlen sind willkürliche Präzision, also wenn man die Fibonacci-Sequenz mit einem interativen Algorithmus berechnet, kannst man exakte Ergebnisse berechnen.

     >>> def fib(n): ... a = 0 ... b = 1 ... while n > 0: ... a, b = b, a + b ... n = n - 1 ... return a ... >>> fib(100) 354224848179261915075L 

    Für Python stehen mehrere Mehrfach-Präzisions-Gleitkomma-Bibliotheken zur Verfügung. Das decimal Modul ist mit Python enthalten und wurde ursprünglich für finanzielle Berechnungen bestimmt. Es unterstützt sqrt() so können Sie die folgenden:

     >>> import decimal >>> decimal.setcontext(decimal.Context(prec=40)) >>> a=decimal.Decimal(5).sqrt() >>> a Decimal('2.236067977499789696409173668731276235441') >>> ((1+a)**100 - (1-a)**100)/(a*(2**100)) Decimal('354224848179261915075.0000000000000000041') 

    Andere Bibliotheken sind mpmath und gmpy2 .

     >>> import gmpy2 >>> gmpy2.set_context(gmpy2.context(precision=150)) >>> a=gmpy2.sqrt(5) >>> a mpfr('2.2360679774997896964091736687312762354406183598',150) >>> ((1+a)**100 - (1-a)**100)/(a*(2**100)) mpfr('354224848179261915075.00000000000000000000000248',150) >>> gmpy2.fib(100) mpz(354224848179261915075L) 

    gmpy2 kann auch Computer Fibonacci Zahlen direkt (wie oben gezeigt).

    Haftungsausschluss: Ich gmpy2 .

    Python ist die beste Programmiersprache der Welt.