OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3793|回复: 8

关于浮点数的问题无解。。。

[复制链接]

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-7-7 10:23:58 | 显示全部楼层 |阅读模式
5金钱
    最近用着浮点型数,发现竟然一点都不会用,表示很无语。
    话说在网上看到的资料上说float型有6~7位有效精度(是不是说有效数字是6~7位啊,整数位+小数位?)。
    在vc6.0上测出的问题如下:





为什么第一张图会是这样???

最佳答案

查看完整内容[请看2#楼]

我也不理解,为什么是1110...这精度好低啊 下面是百度的结果 1. 范围   float和double的范围是由指数的位数来决定的。   float的指数位有8位,而double的指数位有11位,分布如下:   float:   1bit(符号位) 8bits(指数位) 23bits(尾数位)   double:   1bit(符号位) 11bits(指数位) 52bits(尾数位)   于是,float的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2013-10-18
在线时间
5 小时
发表于 2015-7-7 10:23:59 | 显示全部楼层
我也不理解,为什么是1110...这精度好低啊
下面是百度的结果
1. 范围
  float和double的范围是由指数的位数来决定的。
  float的指数位有8位,而double的指数位有11位,分布如下:
  float:
  1bit(符号位) 8bits(指数位) 23bits(尾数位)
  double:
  1bit(符号位) 11bits(指数位) 52bits(尾数位)
  于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
  其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
  float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

2.  精度
  float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
  float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
  double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-7-7 10:23:59 | 显示全部楼层
总结一下:
1、范围
float类型,4字节:-3.40E+38~3.40E+38
double类型:8字节:-1.79E+308~+1.79E+308

2、精度
float类型:有效位数是6~7位,绝对有效位数是6位。例如:123.456 = 1.23456E+2,有效数字6位。
double类型:有效位数是15~16位,绝对有效位数是15位。
注:1、当开始超过有效位数时从右边开始出现误差;2、浮点数在传递存储过程中也会出现误差,误差可能只有0.000001,但也是致命的

在计算的过程中,乘除可能并不在意一些细微的误差,但是有时加减精确度需要很高的时候:建议先根据需要的精度确定小数点的位数,转换为整形数据进行计算(如果需要1位小数位,把数据放大十倍+0.5四舍五入很重要),最后再还原为浮点型数据。
举例:
float a = 1.1234;
int b = 0;
if(a>0) b = a*10000+0.5;//float—>int转换在运算,注:必须要在高一位精度上四舍五入,防止float精度损失产生的影响
else b = a*10000-0.5;
b++;
a = (float)b/10000;

结果:a = 1.1235;

如上,是我对浮点数的理解,如有错误敬请指出。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-7-7 11:40:15 | 显示全部楼层
再看又发现了这个:



还有没有对浮点型数据有更多的见解的,多多交流学习下。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-7-7 11:41:02 | 显示全部楼层
回复【2楼】tim4146:
---------------------------------
二楼
回复

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2015-7-7 13:08:37 | 显示全部楼层
精度在b=a*1000的时候损失了。
如果a=1.111是float,而b=1111是int,a*1000和b并不是相等的。
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
金钱
1606
注册时间
2015-6-10
在线时间
223 小时
发表于 2015-7-7 16:18:56 | 显示全部楼层
1.111转化为二进制等于 1.00011100

有损失
回复

使用道具 举报

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
发表于 2015-7-7 22:39:34 | 显示全部楼层
试试联合体.
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-7-8 08:08:31 | 显示全部楼层
回复【7楼】盒子:
---------------------------------
联合体?共用体?float和十六进制互转常用共用体实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 12:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表