:.NET doubleとpython floatの違いは何ですか? C#ので
Console.WriteLine(1.2d - 1.0d);
は0.2
を生成します。 Python 3で:
print(1.2 - 1.0)
0.19999999999999996
を生成します。
私の目標は、Python 3と同じ浮動小数点結果を生成するC#で高速なコードを書くことです。私は明らかに上記の例だけでなく、すべての浮動小数点演算に興味があります。
これを達成する最も実用的な方法は何ですか?私が使用できるライブラリはありますか?
さらに、私はこの違いをどのように説明しているのか理解したいと思います。どちらの表現も64ビットで、両方ともIEEEに基づいているようです。では、異なる結果を生み出すこれらの実装についてはどういう違いがありますか?
参照:
- 15. Floating Point Arithmetic: Issues and Limitations
- Why are floating-point calculations so inaccurate?
- Real literals
- What Every Computer Scientist Should Know About Floating-Point Arithmetic
- IEEE Floats and Python
文字列表現ではなく、結果のビット単位の表現を見ることから始めてみることをお勧めします。これを行うまでは、減算結果が実際には異なるという証拠はありません。しかし、C#ではJITコンパイラがいくつかの算術演算でより正確な表現を使用できることも理解する必要があります。複数の64ビット演算を実行しながら80ビットの中間結果を使用する。プラットフォーム間でビット互換の算術演算をしたいのなら、それは難しいでしょう。 –
@JonSkeet、ありがとうございます、これは悪いニュースです( –
FWIW、Python 2の '0.2'で表示されますが、' d = 1.2-1.0; print(format(d 、 '0.60f')) 'どちらのバージョンでも' 0.199999999999999955591079014993738383054733276367187500000000'を出力する –