2016-05-21 7 views
1

Ich versuche, einen LCM-Algorithmus zu implementieren. Es muss LCM für sehr große Zahlen finden.Python-Berechnung Fehler

LCM gefunden wird, unter Verwendung der Formel,

LCM(A, B) = (A * B)/GCD(A, B) 

wobei A und B zwei Eingänge.

Input: 226553150 1023473145
So LCM = (226553150 * 1023473145)/5
es sein sollte, 46374212988031350.

Aber python findet dies als 46374212988031352, was offensichtlich ein Fehler ist. Wie löst man dieses Problem? python screenshot

+1

Fließkomma-Mathematik ist ** nicht präzise **. –

+0

Sie können mehr über die Grenzen von Fließkommawerten hier lesen: https://docs.python.org/2/tutorial/floatingpoint.html – Keiwan

+0

Sieht so aus, als ob dies ein Coursera-Kurs ist, ich sehe dort eine [C-Frage zum selben Thema ] (http://stackoverflow.com/questions/36540103/lowest-common-multiple-with-doubles-in-c). –

Antwort

2

Sie verwenden Fließkomma-Mathematik, weil Sie den wahren Division-Operator / verwendet haben. Gleitkomma kann nur große Zahlen annähern, und der Unterschied, den Sie verwenden, ist ein Ergebnis davon.

Verwenden // Boden Division statt:

>>> (226553150 * 1023473145) // 5 
46374212988031350 

Boden Division auf ganze Zahlen erfordert nie Umwandlung zu schweben, die Präzision Probleme zu vermeiden.

Alternativ können Sie die decimal module für höhere Präzision Mathe mit reellen Zahlen:

>>> from decimal import Decimal 
>>> Decimal('226553150') * Decimal('1023473145')/Decimal('5') 
Decimal('46374212988031350') 

Dies ist langsamer als float verwenden.