#include <iostream> using namespace std;
typedef unsigned long DWORD; // little-endian typedef union float_tag { DWORD dw; struct { unsigned int bM:23; // sizeof(int) = 4 int bE:8; int bS:1; }field; }FS;
void main() { int i; float fv; char *pfv; pfv = (char *)&fv; FS *pfsv = (FS*)&fv;
pfsv->dw = 0x80000000; // -0 if(fv == 0) cout<<"-0 == +0"; else cout<<"-0 != +0"; cout<<endl<<endl;
pfsv->field.bS = 0; pfsv->field.bE = 127; // exp=0 pfsv->field.bM = 0x12345678; // 截取低23位
cout<<"构造一个浮点值 S:0 E:(0)d M:0x12345678 "<<fv<<endl; cout<<"其内存表示为 0x"<<hex<<pfsv->dw<<endl<<endl; // 构造一系列浮点数 puts("构造一系列浮点数\n"); for(i=0; i<24; i++) { pfsv->field.bS = 0; pfsv->field.bE = 127; // exp=0 pfsv->field.bM = 1<<i; // 截断取低23位
printf("构造一个浮点值 S:0 E:(0)d M:x \n", 1<<i); printf("内存表示 0xx\n", pfsv->dw); printf("fv=%e %s\n\n", fv, fv>1?">1":"<=1"); }
// 从正方向趋向于0的浮点数 puts("从正方向趋向于0的浮点数"); pfsv->field.bS = 0; pfsv->field.bE = 1; // exp=-126 pfsv->field.bM = 1<<0; // 截断取低23位
printf("构造一个浮点值 S:0 E:(-127)d M:x \n", 1<<0); printf("内存表示 0xx\n", pfsv->dw); printf("fv=%e %s\n\n", fv, fv>0?">0":"<=0"); for(i=0; i<40; i++) { fv = fv/(1<<i); printf("右移 %d ", i); printf("内存表示 0xx\n", pfsv->dw); printf("fv=%e %s\n\n", fv, fv>0?">0":"<=0, Get it!"); }
// 从负方向趋向于0的浮点数
puts("从负方面趋向于0的浮点数"); pfsv->field.bS = 1; pfsv->field.bE = 1; // exp=-126 pfsv->field.bM = 1<<0; // 截断取低23位
printf("构造一个浮点值 S:0 E:(-127)d M:x \n", 1<<0); printf("内存表示 0xx\n", pfsv->dw); printf("fv=%e %s\n\n", fv, fv>=0?">=0":"<0"); for(i=0; i<40; i++) { fv = fv/(1<<i); printf("右移 %d ", i); printf("内存表示 0xx\n", pfsv->dw); printf("fv=%e %s\n\n", fv, fv>=0?">=0, Get it!":"<0"); } }
|