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,这是我们想要的结果!
  • 相关阅读:
    KVM安装之脚本和镜像目录树准备
    KVM安装之网桥
    安装KVM虚拟机步骤
    NFS搭建配置
    为项目组搭建开发测试环境介绍
    VMWare虚拟机copy后网卡不是eth0解决办法
    安装Oracle 10g和SQLServer2008(仅作学习使用VirtualBox虚拟机来安装节省电脑资源)
    常用的SQL语句
    在web项目中集成Spring
    IOC容器装配Bean(注解方式)
  • 原文地址:https://www.cnblogs.com/w-wfy/p/7868157.html
Copyright © 2011-2022 走看看