2017-03-09 10 views
1

Pythonの分数型は、分かりやすいように、内部に置いたもの(すなわち、print(Fraction(4/8))が1/2を出力します)を簡略化したものを出力します。しかし、特定の入力については、私は本当に奇妙な結果を得ています:Pythonの分数型が正しく単純化されていない

分数(984/1920)は41/80を出力するはずですが、代わりに 2308094809027379/4503599627370496となります。

分数(1000/992)は125/124を出力しますが、代わりに4539918979204129/4503599627370496を出力します。

分数(408/896)は51/112を出力しますが、代わりに8202985035567689/18014398509481984を与えます。

分数型に正しく入力された分数を入力すると、同じバグの値が表示されます。これらがどこから来たのかさらに多くの例があります。なぜこれが当てはまるのか、それを改善するために私ができることは何ですか?

答えて

3

は、分子と分母を分離するために、カンマを使用します。

>>> Fraction(984/1920) 
Fraction(2308094809027379, 4503599627370496) 
>>> Fraction(984, 1920) 
Fraction(41, 80) 

/を使用してバイナリ浮動小数点除算は、前に入力がフラクションに渡され、最初に行われることを意味します。

>>> 984/1920 
0.5125 
>>> (0.5125).as_integer_ratio() 
(2308094809027379, 4503599627370496) 

分離することにより:それは分子と2のべき乗の分母のための精度の53ビットで端数を四捨五入した後ので、表示される画分は、2進浮動小数点数のためのものですFractionの引数を使用すると、分子と分母の正確な整数が渡されます。これは、最大公約数分母アルゴリズムを使用して最も低い項に減らすことができます。

関連する問題