なぜコンピュータプログラミング言語:0.1 + 0.2 0.3に等しくありません

最近、学習過程で発見されたJSは、コンピュータで見つかった、非常に興味深いものをJS 0.1 + 0.2〜0.3、しかし0.30000000000000004の結果ではなく、最初にして、小数の乗算を追加し、そして格差は0.3希望を取得するために戻ってきました

 

 私は結果が0.30000000000000004で、PythonのFOUNDが同じである、のpythonでそれを試してみました。

 それから私は、収集情報を始め、最終的に答えを見つけました。バイナリ、指数関数、IEEE 754規格:の理由を知りたい、我々は最初にこれらの点を理解する必要があります。

 1、バイナリー

コンピュータ内のすべてのデータは、整数、浮動小数点、およびデータの他のすべてのタイプを含む、バイナリ形式で格納されています。私たちは、バイナリ0.1と0.2に小数ます

この方法は、比較的単純な変換であり、バイナリ整数に変換:2及び図100において、例えば、から余りを切り上げた整数で割られます。

 

 バイナリ小数に変換され、小数部2を順次丸め、無限が乗算されます。図1を用いて、実施例0.375。

 

 

 

 2、指数関数

指数関数的で限られたスペースに格納することができるより大きな値を表します。

 

全ての10進数は、指数関数形で表すことができ、M * 105 = DとなるE例えば100のように、* 1のように表すことができる2

進数は指数形、M = B * 2で表すことができるEの Mは、ビットBの数であり、Eは指数である形態、そのような0.011として1.1×10として表すことができる-10「-10」-2ここで示されます。

 

図3に示すように、浮動小数点IEEE754標準

JavaScriptは、整数のすべての数値を含み、小数点は一種類のみであり、二重標準の倍精度浮動小数点数である64ビット固定長を表すために使用されるIEEE 754標準を、以下。

 

 

 ここで最初の符号ビット「1」負が表すが、「0」が正の数を表します。

 

バイナリ0.1への最初の変換小数:0.0011001100110011 ......

 

 

 

次いで、これを二進小数0.2に変換される:0.0011001100110011 ........

 

 

 

第二に、0.1及び0.2は、バイナリ指数形式に変換します

小数:0.1

バイナリ形式:0.000110011001100110011 ......

指数形式:1.10011001100110011 ...... * 2- 100           の//インデックス-4

 

小数:0.2

バイナリ形式:0.001100110011001100110011 ......

指数形式:1.100110011001100110011 ...... * 2 -11      //インデックス-3

 

第三に、標準IEEE754形式の変換インデックス

ここではIEEE754標準指定仮数だけ52を保持することができますので、それは(のみ52進を残して、無限小数が丸みを帯びている実行する必要があること、全ての第2 53最初の53あきらめ、「0と1を切り上げ」、および最初の52後1にして、入力する必要があり)

 

 

 

 

 

IEEE 754規格に小数を変換する0.2:

 

 

 

第四に、IEEE 754 0.1 + 0.2の使用形態

 

 

 これは、書き込みが...... 100111 10.0100100100100100100100100100100ですが、結果のインデックス番号がまだ指数関数的である。この時間は、あなたがそれをバイナリ形式に変換したいと、それは簡単であるべき、長すぎる、小数点が3になるように前方に移動することです0.01001001001001001001001 ..... 00111

次に進数に変換される0 * 2 -1 + 1 * 2- 2 + 0 * 2 -3 + 0 * 2 -4 ....... + 1 * 2 -52次いで、得られる0.30000000000000004インクルード

 

それはこれに沸きます:

限られたスペースにデータを記録したコンピュータは、唯一の固定長データストレージ、エンドレスループとしてデータの一部を丸くすることができ、そしていくつかのデータ自体は多少の誤差を有することができるので、誤差は加算演算を行う必要があります。

 

次いで、(0.1×10 + 0.2×10)最後に見/ 3は、それが乗算整数となるので10、0.1と0.2が最初なぜに等しい、その後の整数加算を見てください。

 最後に、3月10日とし、我々は、私は思っていないよ、0.3を取得する方法このカウント、それを直接電卓-..-

 

 

 

 

 

 

 




おすすめ

転載: www.cnblogs.com/hai-long/p/12552148.html