開発環境 |
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