博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中 Float 数据结构的存储计算
阅读量:6623 次
发布时间:2019-06-25

本文共 2370 字,大约阅读时间需要 7 分钟。

1.了解float存储结构

float存储结构请看另一篇文章

2.float最大值

float结构如下图:
要想获得正最大值,那就令符号位为0,指数位和尾数位全为1,则应该是最大会是,最大值应该为:
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
则float类型十六进制表示为:0x7fff ffff 
 以下是测试代码:
[cpp] 
 
 
  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] 
 
 
  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] 
 
 
  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] 
 
 
  1. #define FLT_MIN         1.175494351e-38F        /* min positive value */  
通过了解float类型的结构我们知道如何才能获得正的最小值,要获得正的最小值,我们只要将指数位置成最小及0000 0000 则指数为0-127=-127,然后将尾数位最后一位置1,其它置0
及十六进制为0x0000 00001

5.测试代码

[cpp] 
 
 
  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] 
 
 
  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,这是我们想要的结果!
你可能感兴趣的文章
Ubuntu16.04 安装RabbitMQ
查看>>
javascript游戏引擎
查看>>
JVM Debugger Memory View for IntelliJ IDEA
查看>>
LINUX下GDB反汇编和调试
查看>>
golang fmt格式“占位符”
查看>>
SpringMVC包括哪些组件
查看>>
现代前端开发路线图:从零开始,一步步成为前端工程师
查看>>
elixir 集成ejabberd
查看>>
Oracle绝对值函数
查看>>
mysql 的mgr集群
查看>>
html5播放mp4视频代码
查看>>
032_nginx配置文件安全下载
查看>>
Linux下tomcat修改成的80端口无法访问
查看>>
Kubernetes 集群日志管理 - 每天5分钟玩转 Docker 容器技术(180)
查看>>
redis实现对账(集合比较)功能
查看>>
为了好好看球,学霸们用深度学习重建整个比赛3D全息图
查看>>
浅谈持续集成
查看>>
【ZH奶酪】如何用textgenrnn处理中文
查看>>
CentOS双机中Docker下安装Mysql并配置互为主从模式
查看>>
OkHttp3源码详解(六) Okhttp任务队列工作原理
查看>>