1. 程式人生 > >float類型和double類型的二進制存儲

float類型和double類型的二進制存儲

tail double oar sign pbo ocl signed log title

在32位環境下, float占用32位,double占用64位,

目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和

尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:

符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64

下面分別舉例說明:

將100分別轉化為float型和double型的二進制表達。

100=(1+1/2+1/16)*2^6

轉為float型為

100為正數,符號位為0,

階碼,一共8位,因為指數可以為負,為了便於計算,規定都先加上127,在這裏6+127=133轉為二進制為10000101

尾數轉為1.1001,因為最高位的1 不寫入內存,則尾數轉為23位二進制為10010000000000000000000

合在一起就是01000010110010000000000000000000

轉為double型為

100為正數,符號位為0,

階碼,一共11位,因為指數可以為負,為了便於計算,規定都先加上1023,在這裏6+1023=1029轉為二進制為10000000101

尾數轉為1.1001,因為最高位的1 不寫入內存,則尾數轉為52位二進制為1001000000000000000000000000000000000000000000000000

合在一起就是0100000001011001000000000000000000000000000000000000000000000000

將float轉為二進制字符串

[cpp] view plain copy
  1. //str should have at least 33 byte.
  2. void floattostr(float* a, char* str){
  3. unsigned int c;
  4. c= ((unsigned int*)a)[0];
  5. for(int i=0;i<32;i++){
  6. str[31-i]=(char)(c&1)+‘0‘;
  7. c>>=1;
  8. }
  9. str[32] = ‘\0‘;
  10. }


將double轉為二進制字符串

[cpp] view plain copy
  1. //str should have at least 64 byte.
  2. void doubletostr(double* a, char* str){
  3. long long c;
  4. c= ((long long*)a)[0];
  5. for(int i=0;i<64;i++){
  6. str[63-i]=(char)(c&1)+‘0‘;
  7. c>>=1;
  8. }
  9. str[64] = ‘\0‘;


將32位二進制字符串轉為float

[cpp] view plain copy
  1. float strtofloat(char * str){
  2. unsigned int flt = 0;
  3. for(int i=0;i<31;i++){
  4. flt += (str[i]-‘0‘);
  5. flt <<= 1;
  6. }
  7. dbl += (str[31]-‘0‘);
  8. float * ret = (float*)&flt;
  9. return *ret;
  10. }


將64位二進制字符串轉為double

[cpp] view plain copy
    1. double strtodbl(char * str){
    2. long long dbl = 0;
    3. for(int i=0;i<63;i++){
    4. dbl += (str[i]-‘0‘);
    5. dbl <<= 1;
    6. }
    7. dbl +=(str[63]-‘0‘);
    8. double* db = (double*)&dbl;
    9. return *db;
    10. }

float類型和double類型的二進制存儲