C语言学习第4篇---浮点数概念剖析

举报
CodeAllen 发表于 2021/10/30 00:11:49 2021/10/30
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取   1.内存中的浮点数 1.浮点数在内存的存储方式为:符号位,指数,尾数   类型 符号位 指数 尾数 float 1位(第31位) 8位(第23~30位) 23位(第0~...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取

 

1.内存中的浮点数

1.浮点数在内存的存储方式为:符号位,指数,尾数

 

类型

符号位

指数

尾数

float

1位(第31位)

8位(第23~30位)

23位(第0~22位)

double

1位(第63位)

11位(第52~62位)

52位(第0~51位)

 

float与double类型的数据在计算机内部的表示法是相同的,但由于所占存储空间不同,其分别能够表示的数值范围和精度不同

 

 

2.浮点数存储实例

浮点数的转换方式

1.将浮点数转换为二进制

2.用科学技术法表示二进制浮点数

3.计算指数偏移后的值

 

注意:

计算指数是需要加上偏移量, 而偏移量的值与类型相关

 

实例:对于指数6,偏移后的值如下

float    :127+6  --->133

double : 1023+6--->1029

 

10进制浮点数的内存表示

实数8.25的在内存中的float表示

   ---8025的二进制表示:1000.01-->1.00001*(2^3)

            符号位:0

            指数:127 + 3 --->10000010

            小数:00001

   ---内存中8.25的float表示:

            0100000010 000010000000000000000000  -->0x41040000

 

 

实验1:10进制浮点数的内存表示


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     float f = 8.25;
  5.    
  6.     unsigned int* p = (unsigned int*)&f;
  7.    
  8.     printf("0x%08X\n", *p); //打印十六进制表示,四个字节
  9.    
  10.     return 0;
  11. }

 

一个有趣的问题:

int类型的范围    :[-2^31  ,  2^31 - 1]

float的类型范围 :[-3.4*10^38  ,   3.4*10^38]

 

思考:

int和float都占四字节的内存,为什么float却比int的范围大很多?

 

浮点类型的秘密

1.float能表示的具体数字的个数与int一样

2.float可表示的数字之间不是连续的,存在间隙

3.float只是一种近似的表示法,不能作为精确数使用

4.由于内存表示法相对复杂,float的运算速度比int慢很多

 

注意:double与float具有相同的内存表示法,因此double也是不精确的。由于double占用的内存较多,所能表示的精度比float高、

 

 

实验2;float类型的不精确实例


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     float f = 3.1415f;
  5.     float fl = 123456789;
  6.    
  7.     printf("%0.10f\n", f);
  8.     printf("%0.10f\n", fl);
  9.    
  10.     return 0;
  11. }

 

小结;

1.浮点数类型与整型类型的内存表示法不同

2.浮点类型的内存表示更复杂

3.浮点类型可表示的范围更大

4.浮点类型是一种不精确的类型

5.浮点类型的运算速度较慢

 

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/78566996

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。