2017-05-10 2 views
0

Ich brauche eine Funktion, die eine Liste von Floats erhält, und berechnet die GCD dieser Liste.gcd der Liste der Floats - falsche Ausgabe von Fraktionen

Zum Beispiel angesichts der Eingang [1/2.0, 1/3.0] Ich erwarte, dass der Ausgang 1/6.0

sein aber es ist nicht. es druckt 5.55111512313e-17 oder mit anderen Worten, Null. Das ist mein Code:

def gcd(L): 
    return reduce(fractions.gcd, L) 

print gcd([1/2.0, 1/3.0]) 

Was ist hier falsch? Kann ich es irgendwie reparieren?

+0

Der nächste IEEE 754 64-Bit-Binärschwimmer zu 1/3.0 ist 0.3333333333333333314829616256247390992939472198486328125. Möglicherweise müssen Sie die Eingaben als Fraction-Instanzen angeben, die genau 1/3.0 darstellen können, ohne zuerst float zu durchlaufen. –

+0

@SergeBallesta Es ist gut definiert, als die größte Zahl, die ein Faktor aller Eingaben ist. Es ist einfach nicht was das OP braucht. –

Antwort

0

Sie benötigen Fraction Objekte zu verwenden, da float ungenau ist, deshalb ist die Fraction Klasse existiert:

>>> reduce(fractions.gcd, [Fraction(1,2), Fraction(1,3)]) 
Fraction(1, 6) 
0

Vermeiden Sie durch die Floating-Point-Streit gehen, indem Sie die Zahlen als Brüche behalten ihre Genauigkeit zu bewahren:

import fractions 

def gcd(L): 
    return reduce(fractions.gcd, map(fractions.Fraction, L)) 

print gcd(['1/2', '1/3']) 
# 1/6 
+0

Ich kann keine Strings verwenden, da ich die tatsächlichen Werte nicht kenne, die im Voraus in der Liste erscheinen. –

+0

Nun, dann bauen Sie ein 'Fraction'-Objekt direkt von der Eingabe, wenn Sie können –