2012-02-22 11 views
5

私は、Pythonをいじりましたが、なぜ、Pythonの浮動オブジェクトには分母アトリビュートがないのですか?

>>> [attr for attr in dir(1) if not attr.startswith('_')] 
['bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real'] 
>>> [attr for attr in dir(1.1) if not attr.startswith('_')] 
['as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real'] 

私は「共役」、「IMAG」、および「本物」は複合型との互換性のために存在していることを理解しますが、私は理由を理解することはできません'numerator'と 'denominator'はint型のみに存在し、float型ではありません。

それについての説明はありますか?

+3

あなたは何を期待するより 'math.pi.denominator'を返すために読むことができますか? – dan04

+0

私は7と言っていますが、ウィキペディアの後、私はπが非合理的な数であり、合理的なバージョンの22/7と正確には等しくないことを理解しました。 – Radian

答えて

5

これは、浮動小数点はややロスであるため、ほとんどの場合そうです。これらの浮動小数点はすべての値を完全に表すわけではありません。この例を考えてみましょう:

>>> 1.0/5.0 
0.20000000000000001 

あなたが1.0/5.0のpythonの分母が1801439850948198420000000000000001/100000000000000000 == 3602879701896397/18014398509481984)を返却しなければならないアクセスを望んでいた場合。精度が低下すると、pythonは狂った値を返すしかないので、設計者は関数を実装しないことにしました。

+0

あなたは '3602879701896397/18014398509481984'を意味します。 – dan04

+0

どうして私は、ありがとう。 –

5

は数クラス階層を見てみましょう:Python numbers

numbers.Integralは、それは分子と分母のメンバーを追加することnumbers.Rationalだnumbers.Rational

のサブクラスです。

2

intrationalのサブクラスであり、floatはサブクラスではないためです。 rationalには分母アトリビュートがあるので、intを継承しています。

あなたはhere