開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 fdump
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

fdump.c
#include <stdio.h>
 
void fdump(float value)
{
	unsigned v = *(unsigned *)&value;
	char bit[32+3];
	char *b = bit;
	char sign;		// 符号部(1bit)
	int exponent;		// 指数部(8bit)
	double fraction;	// 仮数部(23bit)
	int i;
 
	for (i = 0; i < 32; i++) {
		*b++ = (v & (1<<(31-i))) ? '1' : '0';
		if (i == 0 || i == 8) *b++ = '.';
	}
	*b = '\0';
	sign = (v & 0x80000000) ? '-' : '+';
	exponent = ((v >> 23) & 0xff) - 127;
	fraction = (v & 0x7fffff) / (double)0x800000;
	printf("%s s:%c e:2^%d f:1+%.7f\n", bit, sign, exponent, fraction);
}
 
int main()
{
	fdump(1.5f);
	fdump(0.5f);
	fdump(-2.0f);
	fdump(0.0f);
	return 0;
}
 

出力
0.01111111.10000000000000000000000 s:+ e:2^0 f:1+0.5000000
0.01111110.00000000000000000000000 s:+ e:2^-1 f:1+0.0000000
1.10000000.00000000000000000000000 s:- e:2^1 f:1+0.0000000
0.00000000.00000000000000000000000 s:+ e:2^-127 f:1+0.0000000



fdump1.c
#include <stdio.h>
 
void fdump(float value)
{
	unsigned char *v = (unsigned char *)&value;
	char bit[35];
	char *b = bit;
	char sign;		// 符号部(1bit)
	int exponent;		// 指数部(8bit)
	double fraction = 0.0;	// 仮数部(23bit)
	double d = 0.5;
	int i;
 
	for (i = 0; i < 32; i++) {
		*b++ = (v[3-i/8] & (1 << (7-i%8))) ? '1' : '0';
		if (i == 0 || i == 8) *b++ = '.';
	}
	*b = '\0';
	sign = (v[3] & 0x80) ? '-' : '+';
	exponent = (((v[3] & 0x7f) << 1) | (v[2] >> 7)) - 127;
	for (i = 9; i < 32; i++) {
		if (v[3-i/8] & (1 << (7-i%8))) fraction += d;
		d *= 0.5;
	}
	printf("b:%s s:%c e:2^%d f:1+%.7f\n", bit, sign, exponent, fraction);
}
 
int main()
{
	fdump(1.5f);
	fdump(0.5f);
	fdump(-2.0f);
	fdump(0.0f);
	return 0;
}
 

出力
b:0.01111111.10000000000000000000000 s:+ e:2^0 f:1+0.5000000
b:0.01111110.00000000000000000000000 s:+ e:2^-1 f:1+0.0000000
b:1.10000000.00000000000000000000000 s:- e:2^1 f:1+0.0000000
b:0.00000000.00000000000000000000000 s:+ e:2^-127 f:1+0.0000000
最終更新:2012年08月31日 11:22