2017-05-10 9 views
0

浮動小数点のリストを取得し、そのリストのgcdを計算する関数が必要です。例えば浮動小数点リストのgcd - 小数からの不正な出力

は、私はそれがないのですが、出力が1/6.0

ことを期待入力[1/2.0, 1/3.0]を与えられました。 5.55111512313e-17、つまり0が出力されます。これは私のコードです

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

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

ここに間違いがありますか?私はそれを修正する方法はありますか?

+0

1/3.0に最も近いIEEE 754 64ビットバイナリフロートは0.333333333333333314829616256247390992939472198486328125です。 floatを最初に経由することなく、入力を1/3.0を正確に表す分数インスタンスとして入力する必要があるかもしれません。 –

+0

@SergeBallestaよく定義されているように、すべての入力の要素である最大の数です。 OPが必要とするものではありません。 –

答えて

0

あなたはfloatが不正確であるので、Fractionクラスが存在する理由です、Fractionオブジェクトを使用する必要があります浮動小数点面倒を経由

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

避け、単にその精度を維持画分としてあなたの番号を保つ:

import fractions 

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

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

私は文字列を使うことができません。リストに現れる実際の値がわからないからです。 –

+0

できれば入力から直接 'Fraction'オブジェクトを構築してください –

関連する問題