単精度浮動小数点型floatの理由は正確に実数を表すものではありませ

フロートは、メモリに格納されています

(左から右へ)アドレスを低下させる高いアドレスから:
符号ビット(ビット31)インデックス(30から23)、仮数部(22〜0)
フロート-32ビットの合計4バイト:

  1. 符号ビット(合計)
    左端のビットは、負の符号は正で0、1であります
  2. インデックス(8ビット)
    のバイナリクラスを表す同一のインデックスを持つ指数部、
  3. 仮数は、(合計23)
    仮数は23ビットの小数+ 1ビットである(後述しました)

仮数について

、1000.01:有効なバイナリとして表さ8.25実施例8.25のために、仮数の浮動小数点数を保存し
1000.01から8.25の有効数は、1000.01仮数は8,25と言うことであるので。表現するために科学的表記法は1.00001 *(23)であれば、そう指数は、1.00001を終了、3です。しかし、メモリは1.00001、しかし00001の一部ではない、それは1点であり、記憶されていないフロート構造仮数に格納されています。我々はすべての最初の有効桁に小数点が移動した後、合意されたため、IEEEは、感じたので、この1つは、単にない、廃棄物を保存するので、それが理由である、小数点とのみ1の前にデフォルトを持っている必要があります彼は23点の理由1ビットを終了すると言います。したがって、コンピュータに、記憶メモリの実際の構造のフロート仮数部は、(23アップティム0メイク後ろ)00001が、実数は仮数1.00001自体、失われていないものであるべきです。
実際には、これは仮数と呼ばれ、私はそれが32最低レベル、上だと思う、それは最後に来て、その名前は、仮数と呼ばれ、それは非常に簡単で、端数絡み合っの概念。8.25は、バイナリに変換され、科学的表記が1.00001 *(23)であり、その仮数でフロートが1.00001であり、実際のストレージは00001であり、この数の小数部分は0.01であり、仮数の小数部分が半ダイムありません。この場所は、実数(ここでは、実際の数は、科学表記表現を示すことに注意してください)ことを示し、それ自体にあるので個人的には、フロートシンプルへの直接呼び出しとして、だと思います。

フロートは本当に理由は正確に進浮動小数点数で表現することはできません

例えば初めて目:0.9のバイナリ表現シーク
小数メソッドのバイナリ表現に変換:、小数部が2で乗算され取る積が0になるまで、トップダウンの数を整数部分をとることと、最終的に除去正配列配置

0.9 * 2 = 1.8 取1
0.8 * 2 = 1.6 取1
0.6 * 2 = 1.2 取1
0.2 * 2 = 0.4 取0
0.4 * 2 = 0.8 取0
0.8 * 2 = 1.6 取1
0.6 * 2 = 1.2 取1
… …

0.9バイナリ表現だから:111001100 ...無限ループ
、我々はそれを見つけ、その後、無限ループをテイクダウンしますが、今まで来たことはありません。アルゴリズムの停止を取得するには、その端数部分等、正確に0.5 0.25〜0.5で割り切れる小数することができます。しかし、この結果は満たすことができません。だから、ほとんどの時間は、10進数のバイナリ表現は無限ループに変換されます。しかし、フロート自体のフロート保存された仮数部は、わずか23の小数点以下の桁数保存、最初の23進数の後に来た意味が浮動小数点につながった、唯一の23ドロップされますができている正確にすることはできません彼は言いました、

公開された40元の記事 ウォン称賛18 ビュー7587

おすすめ

転載: blog.csdn.net/weixin_44395686/article/details/98498306