JavaRush /Java Blog /Random-JA /浮動小数点数の内部には何があり、どのように機能するのでしょうか?
Ivan
レベル 2
Харьков

浮動小数点数の内部には何があり、どのように機能するのでしょうか?

Random-JA グループに公開済み

コンテンツ:

画像:http://pikabu.ru/

導入

Java を学び始めた最初の数日間、私は浮動小数点数のような奇妙な種類のプリミティブに出会いました。私はすぐにそれらの機能に興味を持ち、さらにそれらがバイナリ コードで書かれている方法 (相互接続されている) に興味を持ちました。整数の範囲とは異なり、非常に狭い範囲 (たとえば、1 から 2) であっても、その数は無限に存在します。また、メモリ サイズが有限であるため、この集合を表現することは不可能です。それでは、それらはバイナリでどのように表現され、どのように機能するのでしょうか? 悲しいことに、 Wikiの説明とハブレに関するかなりクールな記事は、基礎を築いたとはいえ、私に完全な理解を与えてくれませんでしたこの分析記事を読んだ翌朝 になって初めて気づきました。

歴史への旅

(ハブレに関するこの記事から引用) コンピューターが大きく、プログラムが小さかった 60 ~ 70 年代には、浮動小数点数自体を表現するための標準だけでなく、計算に関する単一の標準もまだありませんでした。各コンピュータの実行方法は異なり、それぞれに独自のエラーが発生しました。しかし 70 年代半ばに、Intel は「改良された」演算をサポートする新しいプロセッサを製造し、同時にそれを標準化することを決定しました。ウィリアム・ケーハン教授とジョン・パーマー教授(いいえ、ビールに関する本の著者ではありません)が開発のために招かれました。いくつかのドラマがありましたが、新しい標準が開発されました。現在、この規格は IEEE754 と呼ばれています

浮動小数点数形式

学校の教科書でも、誰もが1.2 × 10 3または1.2 E3 ( 1.2 × 1000 = 1200に等しい)の形式の非常に大きいまたは非常に小さい数を書く珍しい方法に直面しました 。これを指数表記法といいます。この場合、式N=M×n pを使用して数値の表現を扱っています 。
  • N = 1200 - 結果の数値
  • M = 1,2 - 仮数 - 小数部、次数を考慮しない
  • n = 10が順序の基本です。この場合、およびコンピューターについて話していないとき、基数は数字の 10 です。
  • p = 3 - 塩基度
多くの場合、順序の底は10であると想定され仮数と底の値のみが文字Eで区切られて書き込まれます。この例では、同等のエントリ1.2 × 10 31.2 E3を与えました 。すべてが明確で、学校のカリキュラムへのノスタルジックな小旅行が終わったら、今度はこれを忘れることをお勧めします。浮動小数点数を作成するときに扱っているからです。 10 ではなく 2 の累乗、つまり n = 2 になると、調和のとれた式1.2E3が崩れてしまい、本当に頭がおかしくなってしまいました。

符号と度数

それで、私たちは何を持っているのでしょうか?その結果、仮数、つまり累乗する部分と累乗そのもので構成される 2 進数も得られます。さらに、整数型の場合と同様に、浮動小数点数には符号 (数値が正か負か) を決定するビットがあります。例として、float32 ビットで構成される型を考慮することを提案します。倍精度数値の場合も、doubleビット数が 2 倍になるだけで、ロジックは同じです。32 ビットのうち、最初の最上位が符号に割り当てられ、次の 8 ビットが指数 (仮数の累乗) に割り当てられ、残りの 23 ビットが仮数に割り当てられます。これを実証するために、例を見てみましょう。 浮動小数点数の中身とその仕組み - 1最初のビットは非常に単純です。最初のビットの値が0 の場合、取得される数値は正の値になります。ビットが1の場合、数値は負の値になります。次の 8 ビットのブロックは指数ブロックです。指数は通常の8 ビットの数値として記述され、必要な次数を取得するには、結果の数値から127を減算する必要があります 。この場合、指数の 8 ビットは10000001です。これは番号129に対応します。この計算方法について質問がある場合は、図に簡単な答えが表示されます。拡張バージョンは、どのブール代数コースでも入手できます。 浮動小数点数の中身とその仕組み - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129これらの 8 ビットから取得できる最大数が11111111 であることを計算するのは難しくありません。 2 = 255 10 (添え字の210は 2 進数と 10 進数を意味します) ただし、正の指数値のみを使用すると、 ( 0 から 255 まで) の場合、結果の数値には小数点の前に多くの数値が含まれますが、その後には含まれません。次数の負の値を取得するには、生成された指数から127 を減算する必要があります。したがって、度の範囲は-127 から 128 になります。この例を使用すると、必要な次数は129-127 = 2になります。とりあえずこの数字を覚えておきましょう。

仮数

次に仮数についてです。これは 23 ビットで構成されますが、最初は常に、ビットが割り当てられていない別の単位が暗黙的に存在します。これは便宜と経済性の理由から行われます。小数点の前後の仮数にゼロを追加することで、同じ数値を異なる累乗で表現できます。これを理解する最も簡単な方法は、10 進指数を使用することです: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8など。ただし、仮数の頭に固定の数値を入力すると、毎回新しい数値を受け取ることになります。23 ビットの前に、1 を含むビットがもう 1 つ存在することを当然のことと考えましょう。通常、このビットはドットによって残りのビットから区切られていますが、これには何の意味もありません。1の方が便利ですよ。111000000000000000000000 浮動小数点数の中身とその仕組み - 3ここで、結果の仮数を左から右にべき乗し、ステップごとに 1 ずつ減少させる必要があります。計算の結果得られたべき乗の値、つまり2から始めます (2 のべき乗の各値を書かないように、意図的に単純な例を選択し、上の表では計算しませんでした)。対応するビットはゼロ) 浮動小数点数の中身とその仕組み - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0.5 = 4+2+1+0.5 = 7.5 を実行し、結果7.5を取得しました。正確性は、たとえばこのリンクで確認できます。

結果

標準の浮動小数点数はfloat32 ビットで構成され、最初のビットは符号 (+ または -)、次の 8 ビットは指数、次の 23 ビットは仮数です (ビット 0 が正の数の場合)。ビット 1 が負の場合。 指数関数により、ビットごとに10進数に変換します (左から最初のビットは128、2番目は64、3番目は 32、4番目は16、5番目は 8、6番目4、7番目は2、 8 番目は1 )、結果の数値から127を引くと、開始する次数が得られます。 仮数に従って、前にある既存の 23 ビットに、値 1 を持つ別のビットを追加し、そこから受信したべき乗まで上げ始め、後続の各ビットでこのべき乗を減分します。 以上です、皆さん、子供たち!PS: 宿題として、この記事を使用して、浮動小数点数を使用した多数の算術演算で精度エラーが発生する理由についてのバージョンをコメントに残してください。 浮動小数点数の中身とその仕組み - 5
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION