C語言中 Float 數據結構的存儲計算


1.了解float存儲結構

float存儲結構請看另一篇文章 http://blog.csdn.net/whzhaochao/article/details/12885875

2.float最大值

float結構如下圖:
要想獲得正最大值,那就令符號位為0,指數位和尾數位全為1,則應該是最大會是,最大值應該為:
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
則float類型十六進制表示為:0x7fff ffff 
 以下是測試代碼:
[cpp]  view plain  copy
 
  1. void main(int argc, char* argv[])  
  2. {  
  3.     float a=-8.25;  
  4.     char *p=(char*)&a;  
  5.   
  6.     *p=0xff;  
  7.     *(p+1)=0xff;  
  8.     *(p+2)=0xff;  
  9.     *(p+3)=0x7f;  
  10.   
  11.       
  12.     printf("\n&a=%x",&a);  
  13.     printf("\na=%f",a);  
  14.   
  15. }  
結果並不和我們想的一樣,出現了1.#QNAN0,這個我也不知道為什么,知道原因的可以回復!

 
如果指數位最后一位為0,則是我們想要的結果,
我們知道float最大為(2-2^-23)*2^127= 3.4028234663852886*10^38
見float.h
[cpp]  view plain  copy
 
  1. #define FLT_DIG         6                       /* # of decimal digits of precision */  
  2. #define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
  3. #define FLT_GUARD       0  
  4. #define FLT_MANT_DIG    24                      /* # of bits in mantissa */  
  5. #define FLT_MAX         3.402823466e+38F        /* max value */  
  6. #define FLT_MAX_10_EXP  38                      /* max decimal exponent */  
  7. #define FLT_MAX_EXP     128                     /* max binary exponent */  
  8. #define FLT_MIN         1.175494351e-38F        /* min positive value */  
  9. #define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */  
  10. #define FLT_MIN_EXP     (-125)                  /* min binary exponent */  
  11. #define FLT_NORMALIZE   0  
  12. #define FLT_RADIX       2                       /* exponent radix */  
  13. #define FLT_ROUNDS      1                       /* addition rounding: near */  


當我們令指數位為:1111 1110 =254 則指數為254-127=127
尾數位全為1,則最大數為1.11111111111111111111111*2^127=(2-2^-23)*2^127=3.4028234663852886*10^38
則十六進制表示為:0x7f7f ffff

3.測試代碼:

[cpp]  view plain  copy
 
  1. void main(int argc, char* argv[])  
  2. {  
  3.     float a=-8.25;  
  4.     char *p=(char*)&a;  
  5.   
  6.     *p=0xff;  
  7.     *(p+1)=0xff;  
  8.     *(p+2)=0x7f;  
  9.     *(p+3)=0x7f;  
  10.   
  11.       
  12.     printf("\n&a=%x",&a);  
  13.     printf("\na=%f",a);  
  14.   
  15. }  
 
我們從結果可以看出
&a=12ff44
a=340282346638528860000000000000000000000.000000
這是float的最大值


4.float正最小值

float.h中我們看到float正的最小值為 1.175494351e-38F
[cpp]  view plain  copy
 
  1. #define FLT_MIN         1.175494351e-38F        /* min positive value */  
通過了解float類型的結構我們知道如何才能獲得正的最小值,要獲得正的最小值,我們只要將指數位置成最小及0000 0000 則指數為0-127=-127,然后將尾數位最后一位置1,其它置0
及十六進制為0x0000 00001

5.測試代碼

[cpp]  view plain  copy
 
  1. void main(int argc, char* argv[])  
  2. {  
  3.     float a=-8.25;  
  4.     char *p=(char*)&a;  
  5.   
  6.     *p=0x01;  
  7.     *(p+1)=0x00;  
  8.     *(p+2)=0x00;  
  9.     *(p+3)=0x00;  
  10.   
  11.   
  12.     printf("\n&a=%x",&a);  
  13.     printf("\na=%e",a);  
  14.   
  15.   
  16. }  

我們得到的結果為 1.00000000 00000000 0000 01*2^-127= 5.877472454760670*10^-039,可是結果不是我們預測的!不知道為什么
 
如果將指數位置成1,測試代碼如下:
[cpp]  view plain  copy
 
  1. void main(int argc, char* argv[])  
  2. {  
  3.     float a=-8.25;  
  4.     float b=0;  
  5.     char *p=(char*)&a;  
  6.   
  7.     *p=0x01;  
  8.     *(p+1)=0x00;  
  9.     *(p+2)=0x80;  
  10.     *(p+3)=0x00;  
  11.       
  12.     printf("\n %d ",sizeof(a));  
  13.     printf("\n&a=%x",&a);  
  14.     printf("\na=%e",a);  
  15.   
  16.   
  17. }  
 


我們看到結果為 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038,這是我們想要的結果!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM