
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 です。
}
No.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進数での桁数です。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
【C言語】全角文字の配列を、全...
-
プログラマー達は何故、プログ...
-
C# で 数式文字列処理を処理す...
-
C言語 関数、変数の宣言について
-
プログラミングc++を全く分か...
-
逆コンパイルと逆アセンブルの...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
C言語について(初心者)
-
プログラマーです。このDB設計...
-
C#でログファイルにファイルパ...
-
c言語
-
いまc言語の標準ライブラリ文字...
-
ペーパーマリオみたいにドット...
-
プログラミング 2つの整数を読...
-
visual studio 2022でのC#プロ...
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
あってる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
一般のソフトで画像を扱う場合...
-
エクセルVBAのIf,Then 構...
-
ビットシフトってどんな時使うの?
-
シーケンス制御についての質問...
-
C言語で128bitの2進数のビット...
-
03分22秒36のような時間の単位...
-
文字参照は10進数と16進数では...
-
16ビットCPUで32ビットの計算方法
-
C言語やC++言語でビット毎に値...
-
C言語「K&R」の演習2-9について
-
2の補数
-
verilog 符号付加減算(最上位...
-
ULONGLONGよりも大きい整数を扱う
-
二元対称無記憶通信路を実現す...
-
情報科学の飽和演算、ラップア...
-
命令について
-
オーバーフローについて教えて...
-
マイクロコンピューター制御の...
おすすめ情報