2 進数を浮動小数点数で表現する必要があります。私は 16 進数を FFFF として持っています。この 16 進数を 2 進数に変換すると、対応する 2 進数が 1111111111111111 として得られます。Intel プロセッサで使用されるストレージ形式は 32 ビットで、符号は 1 ビット、指数は 8 ビットを意味します。 、仮数部は 23 ビットです。私はいくつかのアイデアを持っていますが、かなり混乱しています。この 2 進数に対応する float 値を教えてくれる人はいますか??
2 に答える
32個
試してみてください:
#include <stdio.h>
int main() {
union {
unsigned i;
float f;
} u;
u.i = 0xffffffff;
printf("%f\n", u.f);
return 0;
}
印刷し-nan
ます。この実験は、質問が述べているように、実際には望んでい0xffffffff
ないことを前提としています。0xffff
http://en.wikipedia.org/wiki/Single_precisionを見ると、指数0xFF
とゼロ以外の仮数が NaN として扱われることがわかります。
16個
あなたの質問が書いているように、あなたが本当に後0xFFFF
だけなら、コードは を出力しますが、 を に0.000000
変更すると. これは、integer と float の両方が同じエンディアンを使用するためです。つまり、bit pattern に対応する float について話しているのです。%f
%g
9.18341e-41
0x0000ffff
ゼロ符号 (つまり、正)、ゼロ指数、ゼロ以外の仮数があることがわかります。同じウィキペディアの記事によると、これは非正規数を表しています。したがって、これは実際には 0xffff ∙ 2 −149 = 65535 ∙ 2 −149です。
IEEE-754 32ビットフロート0xFFFFFFFF
(つまり32ビットフロート)を想定すると、次のようになります。
最初は記号なので、負のフロートです。次に指数が来ます。これは最大値であるため、「特別な」指数です。
仮数はゼロではないため、結果はになりNaN
ます。
出典:ウィキペディア。
16個だけが必要な場合は、次のようにします。
どうやら、これはMvGによって示されているようには当てはまりません。
残りのビットがゼロであると仮定すると、入力は0x0000FFFF
です。最初のビットは符号で、これはゼロです。したがって、正のフロートがあります。
次に、指数に8ビットがあります。それらはすべてゼロなので、(分数に応じて)ゼロまたは非正規化数のいずれかになります。
分数がすべてゼロではないため、この浮動小数点数は非正規化数です。
この時点で、9ビットをチェックしたので、まだ7つの余分なゼロがあります。
分数は7つのゼロとそれに続く16のゼロで構成されているため、仮数は(2進数で)0.00000001111111111111111
です。これに掛けると2e-126
、答えが得られます。
結果は、明らかに、9.18341e-41
です。