float の指数が 127 だけ変位するのはなぜですか?
本当の問題は、2 の補数表記と比較して、そのような表記の利点は何ですか?
5 に答える
格納されている指数は符号なしであるため、整数命令を使用して浮動小数点値を比較できます。浮動小数点値全体は、比較のために符号付きマグニチュード整数値として扱うことができます (2 の補数ではありません)。
@Stephen Canon、ysapの回答に対する回答(申し訳ありませんが、これは私の回答に対するフォローアップコメントであるはずですが、元の回答は未登録ユーザーとして入力されたため、まだコメントできません)。
スティーブン、明らかにあなたは正しいです、私が言及した指数の範囲は正しくありませんが、答えの精神はまだ当てはまります。バイアスされた値ではなく2の補数であると仮定し、0x00と0xFFの値がまだ特別な値であると仮定すると、バイアスされた指数は2の補数の指数よりも(2x)大きい数を許容します。
いくつかの誤った情報を修正するだけ2^n * 1.mantissa
です。分数の前の 1 は暗黙的に格納されます。
バイアス付きと 2 の補数では、指数の表現可能な範囲にわずかな違いがあることに注意してください。IEEE 標準では、(-127 ~ +128) の範囲の指数がサポートされていますが、2 の補数の場合は (-128 ~ +127) になります。標準がバイアス形式を選択する理由はよくわかりませんが、委員会のメンバーは、極端に小さい数よりも極端に大きい数を許可する方が便利だと考えたのかもしれません。
32 ビット float の指数は 8 ビットで構成されますが、符号ビットはありません。したがって、範囲は事実上 [0;255] です。数値 < 2^0 を表すために、その範囲は 127 シフトされ、[-127;128] になります。
このようにして、非常に小さな数を非常に正確に表すことができます。[0;255] の範囲で2^0 * 0.mantissa
は、仮数部に多数のゼロがあるように小さな数値を表す必要があります。2^-126 * 0.mantissa
ただし、[-127;128] の範囲では、 (仮数部の不要なゼロが少ない)として表すことができるため、小さい数値はより正確になります。ポイントを理解していただければ幸いです。