2018年04月07日
《その358》float型の内部表現
float型の内部表現
float型のサイズは、通常 4バイト(32ビット)です。
下記のプログラムでは、3つの float型実数、
-12.75
16.5
0.0625
について、各値がどのような内部表現で格納されているかを調べるために、実際の記憶域のビットの並びを画面に出力しています。
float型の実際の内部表現は、下記のプログラムの出力結果で確認できますが、その前に、
-12.75 を例に、内部表現を表現ルールに従って導いてみたいと思います。
前述しましたように、一般的な環境においては、1つの float型浮動小数点数を表現するのに、コンピュータ内部で 32ビットが使われます。
00000000 00000000 00000000 00000000
32ビットを上記のように表すと、
・最初の 1ビット(0 で表した部分)は、符号
・次の 8ビット(0 で表した部分)は、指数部
・残りの 23ビット(0 で表した部分)は、仮数部
という構成になっています。
-12.75 は負の数ですから、最初の符号ビットは
1
です。
次に、12.75 を 2進表記で表すと、
1100.11
すなわち
1.10011 × (2 の 3乗)
です。
指数部には、指数に 127 を加えて格納するルールになっています。
したがって
3 + 127 = 130
130 の 2進表記は
10000010
で、これが指数部になります。
次に仮数部ですが、
1.10011 の整数部分を省き、
10011 を格納するルールです。
仮数部は 23ビットありますから、
1001100 00000000 00000000
となり、これが仮数部です。
以上より、float型 −12.75 は、コンピュータ内部に、
11000001 01001100 00000000 00000000
という表現で格納されます。
この内部表現は、下記のプログラムの出力結果と一致します。
以下は、プログラムです。実際の記憶域のビットの並びを画面に出力します。
#include <string>
#include <iostream>
using namespace std;
const unsigned bits
= numeric_limits<unsigned char>::digits;
string bits_of(char x) {
string temp;
for (unsigned i = 0; i < bits; i++) {
if ((x >> i) & 1U)
temp = '1' + temp;
else
temp = '0' + temp;
}
temp += '\0';
return temp;
}
void func(float& ref) {
char* ptr = reinterpret_cast<char*>(&ref);
string x;
for (int i = 0;
i < sizeof(float) / sizeof(char);
i++
)
x = bits_of(*(ptr + i)) + x;
cout << x << '\n';
}
int main() {
float x;
x = -12.75; func(x);
x = 16.5; func(x);
x = 0.0625; func(x);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7525451
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック