C++浮點數的結構分解

#include <iostream>
#include <iomanip>

using namespace std;

ostream& ShowHex(ostream& out, int val)
{
  return out <"0x" <hex <setfill('0') <setw(8) <val;

int main()
{
    union{
          long a;
          float b;          
    } foo ;
    
    cout <sizeof(long) <" " <sizeof(float) <" " << sizeof(foo) <<endl <endl;
    
    // zero
    foo.b = 0.0;
    cout <"Number: " <foo.b <" HEX="; ShowHex(cout, foo.a) <endl;
    cout <"Sign bit: "; ShowHex(cout, (foo.a>>31)&0x01) <endl;
    cout <"Exp bits: "; ShowHex(cout, (foo.a>>23)&0xFF) <" Val=" <dec <((foo.a>>23)&0xFF) <endl; 
    cout <"Frac bit: "; ShowHex(cout, foo.a&0x400000) <endl <endl;

    // positive float            
    int cnt = 0;
    for (foo.b=1 ; foo.b/2.0!=0 && cnt<10 ; foo.b/=2.0, ++cnt)
    {
        cout <"Number: " <foo.b <" HEX="; ShowHex(cout, foo.a) <endl;
        cout <"Sign bit: "; ShowHex(cout, (foo.a>>31)&0x01) <endl;
        cout <"Exp bits: "; ShowHex(cout, (foo.a>>23)&0xFF) <" Val=" <dec <((foo.a>>23)&0xFF) <<endl; 
        cout <"Frac bit: "; ShowHex(cout, foo.a&0x400000) <endl <endl;
    }
    cout <endl;
    
    // negative float 
    cnt = 0;
    for (foo.b=-1 ; foo.b/2.0!=0 && cnt<10 ; foo.b/=2.0, ++cnt)
    {        
        cout <"Number: " <foo.b <" HEX="; ShowHex(cout, foo.a) <endl;
        cout << "Sign bit: "; ShowHex(cout, (foo.a>>31)&0x01) <endl;
        cout <"Exp bits: "; ShowHex(cout, (foo.a>>23)&0xFF)<<" Val=" << dec <((foo.a>>23)&0xFF) <endl;
        cout <"Frac bit: "; ShowHex(cout, foo.a&0x400000) <endl <endl;
    }
    
    return 0;
}

留言