zoukankan      html  css  js  c++  java
  • 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(" &a=%x",&a);  
    13.     printf(" a=%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(" &a=%x",&a);  
    13.     printf(" a=%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(" &a=%x",&a);  
    13.     printf(" a=%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("  %d ",sizeof(a));  
    13.     printf(" &a=%x",&a);  
    14.     printf(" a=%e",a);  
    15.   
    16.   
    17. }  
     


    我们看到结果为 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038,这是我们想要的结果!
  • 相关阅读:
    开始学习编写用于 Windows SideShow 设备的小工具【转】
    Windows Mobile 6.5 Developer Tool Kit 下载
    Microsoft Security Essentials 微软免费杀毒软件下载
    SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (2)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (4)
    负载测试、压力测试和性能测试的异同
    Windows Server 2008 Vista Sidebar Gadget (侧边栏小工具) 入门开发实例
    Silverlight Tools 安装失败 解决办法
    SQL Server 2008 空间数据库 空间索引概念及创建(取自帮助)
  • 原文地址:https://www.cnblogs.com/w-wfy/p/7868157.html
Copyright © 2011-2022 走看看