プロが教える店舗&オフィスのセキュリティ対策術

float型の内部表現を表示するプログラムを書いていくつか試してみたのですが、どこからどこまでが仮数部でどこからどこまでが指数部なのか良くわかりません。

曲がりなりにも自分で考えた結果は次のとおりです。

10進表示: 内部表現 ;2進の指数表現

2 :01000000000000000000000000000000;10.0*10^0
4 :01000000100000000000000000000000;10.0*10^1
8 :01000001000000000000000000000000;10.0*10^10
16:01000001100000000000000000000000;10.0*10^11
32:01000010000000000000000000000000;10.0*10^100

また、
1 :00111111100000000000000000000000;0.1111111*10^0
0.5 :00111111000000000000000000000000;0.0111111*10^0
0.25:00111110100000000000000000000000;?
0.125:00111110000000000000000000000000;?
0.0625:00111101100000000000000000000000;?

となりました。最上位ビットが符号だということは分かります。

質問をまとめると、
(1) 10進で 0.5 の2進指数表現は 0.0111111*10^0 ということなのでしょうか。もしそれで正解なら、どうして 0.1*10^0 としないでわざわざ丸め誤差を含む無限小数で表すのでしょうか。

(2) 仮数部と指数部のビットは決められていなくて、例えば状況によって仮数部のビットが少なくなり指数部のビットが多くなったりするのでしょうか。

(3)仮数部での小数点はどこにあるのでしょうか。

(4)float 型の小数精度は最小6桁ということですが、これは10進で6桁なのか2進で6桁なのか教えてください。

どれか一つでも教えていただけると助かります。

使ったコンパイラは Borland C++ Compiler 5.5 です。
}

A 回答 (2件)

> 使ったコンパイラは Borland C++ Compiler 5.5 です。



とのことですので、IEEE754(IEC559)に限った話として回答します。

> 1) 10進で 0.5 の2進指数表現は 0.0111111*10^0 ということなのでしょうか。もしそれで正解なら、どうして 0.1*10^0 としないでわざわざ丸め誤差を含む無限小数で表すのでしょうか。

たとえばfloat型の場合、最上位ビットが符号ビット、続く8ビットが指数部、下位23ビットが仮数部です。
0.5のビット表現は、

00111111000000000000000000000000

ですが、これは

符号: 0 (正)
指数部: 01111110 (-1)
仮数部: 00000000000000000000000 (1.0)

の意味ですので、1.0×2^(-1) = 0.5 ということになります。
ここで、指数部には+127というバイアスがあります。簡単にいうと、指数部が127 (=01111111) の場合に 2^0 となるという意味です。上記では126ですので、2^(-1)になっています。

なお、指数部表現における基数は、FLT_RADIXマクロを調べればわかります。IEC559では、FLT_RADIXは2になるため、2^(指数部-127)になるわけです。

> (2) 仮数部と指数部のビットは決められていなくて、例えば状況によって仮数部のビットが少なくなり指数部のビットが多くなったりするのでしょうか。

仮数部と指数部のビット幅は固定です。

> (3)仮数部での小数点はどこにあるのでしょうか。

仮数部では、指数部が0の場合を除いて、常に 1.~ であるとして扱われます。そのため、最初の1はビット表現の中には現れません。ビット表現は、すべて小数点以下と考えてください。

> (4)float 型の小数精度は最小6桁ということですが、これは10進で6桁なのか2進で6桁なのか教えてください。

FLT_DIGのことを言われているのかと思いますが、FLT_DIGにせよDBL_DIGにせよ(LDBL_DIGにせよ)、すべて10進数での桁数です。
    • good
    • 0
この回答へのお礼

いままでもやもやしていたものが、目からウロコが落ちたようにはっきりと分かりました。

大変丁寧な回答ありがとうございました。

お礼日時:2006/04/29 15:40

BCCのfloat/doubleは、IEEE 754に準拠してるみたいです。



参考URL:http://ja.wikipedia.org/wiki/IEEE754
    • good
    • 0
この回答へのお礼

とても分かりやすいサイトでした。
ありがとうございました!

お礼日時:2006/04/29 15:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!