2017-01-17 5 views
2

2.5 // 2.0の背後にある理論的根拠は、intではなくfloatを返します。 整数値の場合は、intオブジェクトに入力してください。2.5/2.0の背後にある根拠は何ですか?Python 3.xではintではなくfloatを返しますか?

[編集]

私はこれがそうであるという事実の正当性を探しています。このようにするための議論は何でしたか?まだそれらを見つけることができませんでした。用語 "床部門は" 示唆より

[EDIT2]

floorとの関係は、より多くの問題があります!

3.5 // 5.5 == 0.0に対し

floor(3.5/5.5) == 0(int型)

(フロート)

はまだここに任意のロジックを識別することはできません:(

を[EDIT3]

PEP238から:

ユニファイドモデルでは、整数1は、浮動小数点数1.0(その不正確さを除いて)と区別できず、両方とも はすべての数値コンテキストで同じように動作する必要があります。

Numpyのような重要ではないライブラリは、浮動小数点数をインデックスとして提供するときに、たとえ整数であっても不平を言っています。だから、「区別がつかない」というのは現実ではない。これに関連してバグを狩るのに少し時間を費やしました。 //の本当の性質について学ぶことは非常に驚きでした。そして、それはドキュメントからは明らかではありませんでした(私のために)。

私はPython 3.xの設計をかなり信頼しているので、このように定義するのは非常に明白な理由がないと思いました。しかし、今私は不思議です...

+0

それはフロートを返します数字は浮動小数点数です。整数の末尾に ".0"を追加すると、Pythonで浮動小数点に変換されます。 –

+1

@ SparklePonyはルールかもしれませんが、ルールは理由ではありません。これは面白い質問だと思います。 –

+2

@ SparklePony:引数の両方が浮動小数点であることは明らかです。これは出力が浮動小数点でなければならないわけではありません。我々はすでにフロートを返す1/2を持っています。なぜ1.0/2.0ではintを返さないのでしょうか? – user2357112

答えて

6

//オペレータはPEP 238で覆われています。まず第一に、「整数除算」ではなく「フロア除算」であり、結果が整数であると主張されることはないことに注意してください。

床課のセマンティクス上のセクションから:

フロア部門は全てのPython数値型で実装され、その結果を除いて

a // b == floor(a/b) 

の意味を持つことになりますtypeは、aとbが操作の前に強制される共通の型になります。

以降:浮動小数点入力の場合

、結果は浮動小数点数です。たとえば:

3.5//2.0 == 1.0 

この決定の論理的根拠を明示的に記述されていない(または私はそれを見つけることができませんでした)。しかしながら、それが実現されている方法は、それが他の数学的操作(強調鉱山)と一致している:

及びBが同じタイプのものであれば具体的には、a//bがあまりにもそのタイプのものであろう。入力が異なるタイプのものである場合、それらはまず他のすべての算術演算子と同じ規則を使用して共通タイプに強制的に変換されます。

また、結果は自動的に整数精度を超えて、非常に大きな浮動小数点数のための奇妙な、驚くべき結果をもたらすことができること、intに変換される場合:両方のため

>>> 1e30 // 2. 
5e+29 
>>> int(1e30 // 2.) 
500000000000000009942312419328 
+2

この決定のためにPEPに推論がありますか?そうでなければ、私たちはまだ説明なしでルールを指しているだけです... –

+0

@KarolyHorvath私の編集を参照してください。主な理由は、(a)他の算術演算と一貫していること、(b)大きな浮動小数点数を混乱させていないことだと思います。 –

+1

「整数精度を超えている非常に大きな浮動小数点数に対して、奇妙で驚くべき結果」 - それ以外の方法で。これは精度を失う浮動小数点数です。整数変換は、より多くの桁を表示することによって、精度の損失を明白にします。 – user2357112

関連する問題