2017-05-10 3 views
0

J'ai besoin d'une fonction qui obtient une liste de flottants, et calcule le gcd de cette liste.gcd de la liste des flottants - sortie incorrecte des fractions

Par exemple, étant donné l'entrée [1/2.0, 1/3.0] je pense que la sortie soit 1/6.0

Cependant ce n'est pas. il imprime 5.55111512313e-17 ou en d'autres termes, zéro. Ceci est mon code:

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

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

Qu'est-ce qui ne va pas ici? Y a-t-il un moyen de le réparer?

+0

Le flottant binaire 64 bits IEEE 754 le plus proche de 1/3,0 est 0,333333333333333314829616256247390992939472198486328125. Vous devrez peut-être fournir les entrées sous la forme d'instances de fractions qui peuvent représenter exactement 1/3.0, sans passer d'abord par float. –

+0

@SergeBallesta Il est bien défini, comme le plus grand nombre qui est un facteur de toutes les entrées. Ce n'est pas ce dont le PO a besoin. –

Répondre

0

Vous devez utiliser Fraction objets, car float est imprécise, qui est la raison pour laquelle la classe existe Fraction:

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

éviter de passer par les tracas à virgule flottante, il suffit de garder vos numéros en tant que fractions conservant leur précision:

import fractions 

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

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

Je ne peux pas utiliser de chaînes car je ne connais pas les vraies valeurs qui apparaîtront dans la liste à l'avance. –

+0

Eh bien, construisez un objet 'Fraction' directement à partir de l'entrée si vous le pouvez –