讨论——程序设计中注意float与int型数据之间的转换

[复制链接]
3500|13
手机看帖
扫描二维码
随时随地手机跟帖
chuntian2016|  楼主 | 2016-9-23 20:00 | 显示全部楼层 |阅读模式
如题,这个问题是比较简单的,至少单从子里上看的,其实不然的,在程序设计中特别要注意的,特别是做哪些诸如传感器的精度设计方面的,这时候每一个小数点的保留就非常关键了。。
那么,就会有人问我们了,,那么强调数据的精度小数点的保留位数的, 我们为什么不直接的采用double、float型的数据格式的反而用int型这种吃力不讨好的数据类型的呢?
chuntian2016|  楼主 | 2016-9-23 20:02 | 显示全部楼层
这个就是我们要说的程序的执行效率的问题了,针对小数据的,我们去选用double、float类型的,就显得大材小用了,还有我们一般选用的MCu的执行效率的本身就不是很高的,在选用前者的话,程序运行起来的就会非常慢的,达不到我们的预期要求的。。

使用特权

评论回复
chuntian2016|  楼主 | 2016-9-23 20:05 | 显示全部楼层
好了,说了这么多的,是不是有点偏离主题的呢, 不然,我们先搞清楚各自的定义的啦

先看int型的——
int型为带符号整数类型,对于16位编译器,int占2字节8位;对于32位和64位编译器,int型占4字节32位。
不同的占用空间,int型的范围也不同。
2字节时,int 范围为-32768~32767.
4字节时,int范围为-2147483648~2147483647

无论是哪种存储方式,均是最高位为符号位,0代表正数,1代表负数。
剩余位存储实际值。

使用特权

评论回复
chuntian2016|  楼主 | 2016-9-23 20:07 | 显示全部楼层
再看float与double的——
种类-------符号位-------------指数位----------------尾数位----
float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)
double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)

取值范围主要看指数部分:
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。

使用特权

评论回复
chuntian2016|  楼主 | 2016-9-23 20:08 | 显示全部楼层
紧接着的

由于float的指数部分对应的指数范围为-128~128,所以取值范围为:
-2^128到2^128,约等于-3.4E38 — +3.4E38

精度(有效数字)主要看尾数位:
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位

这样一说的就注意我们常说的float型的数据的实际取值范围的

使用特权

评论回复
chuntian2016|  楼主 | 2016-9-23 20:09 | 显示全部楼层
好了,,说到这的,就讲下这几者之间的转换的。。
计算十进制的时候,是四舍五入,计算机再计算二进制小数也挺简单,就是0舍1入。对于float,要截断成为23位,假如卡在24位上的是1,那么就会造成进位,这样的话,存起来的值就比真正的十进制值大了,如果是0,就舍去,那么存起来的值就比真正的十进制值小了。因此,这可以合理的解释一个问题,就是0.6d转换成float再转换回double,它的值是0.60000002384185791,这个值是比0.6大的,原因就是 0.6的二进制科学计数法表示,第24位是1,造成了进位。
这一点都要注意的。。

使用特权

评论回复
chuntian2016|  楼主 | 2016-9-23 20:10 | 显示全部楼层
他们之间具体的转换关系的概括如下的:
int可以稳式转换成float和double,float只能强制转换成int,但是可以隐式转换成double,double只能强制转换成float和int,这个就跟上边的说明是相关西的

使用特权

评论回复
chuntian2016|  楼主 | 2016-9-23 20:11 | 显示全部楼层
好了,具体的实例分享与分析的就交给各位了吧。。继续跟进的吧。。。

使用特权

评论回复
yu515301489| | 2016-9-24 15:10 | 显示全部楼层
一般数据就整形放大一百倍。其实对于一般传感器来说这个浮点的表示误差基本可以忽略不的吧~

使用特权

评论回复
vivilzb1985| | 2016-9-25 12:22 | 显示全部楼层
chuntian2016 发表于 2016-9-23 20:05
好了,说了这么多的,是不是有点偏离主题的呢, 不然,我们先搞清楚各自的定义的啦

先看int型的——

int的两字节的范围不是0~65535么?

使用特权

评论回复
shenmu2012| | 2016-9-25 17:40 | 显示全部楼层
这个主要注意需要保留的位数的设计的

使用特权

评论回复
comeon201208| | 2016-9-25 18:02 | 显示全部楼层
这个要特别注意float的字节定义的。。

使用特权

评论回复
angerbird| | 2016-9-25 20:02 | 显示全部楼层
chuntian2016 发表于 2016-9-23 20:05
好了,说了这么多的,是不是有点偏离主题的呢, 不然,我们先搞清楚各自的定义的啦

先看int型的——

int型的数据的定义范围还不一样的?

使用特权

评论回复
lordroid| | 2016-9-26 09:00 | 显示全部楼层
angerbird 发表于 2016-9-25 20:02
int型的数据的定义范围还不一样的?

int数据类型占多少字节跟编译器有关,不是固定2字节或4字节

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

1485

帖子

1

粉丝