打印

STM8S单片机将unsigned long型变量装入float型中出错

[复制链接]
4183|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
motor666|  楼主 | 2012-2-23 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个在PIC单片机中的成熟的程序,其中有两个变量:unsigned long Sample_Value 和float Voltage ;  运算过程中有:Voltage = Sample_Value; 编译不提示错,单运行后Voltage的值并不等于Sample_Value;将Sample_Value强制转换类型成float:
Voltage = (float) Sample_Value;  结果也是错的。
沙发
香水城| | 2012-2-23 15:25 | 只看该作者
这不奇怪。

学软件的都知道,作为基本常识,浮点数是不能拿来做比较的,经运算后浮点数的尾数精度是有变化的。

使用特权

评论回复
板凳
香水城| | 2012-2-23 15:27 | 只看该作者
一般讲:unsigned long 的内码是32个二机制位,而float的内码是16个二机制位,经过转换之后必然有精度损失。

使用特权

评论回复
地板
李富贵| | 2012-2-23 15:35 | 只看该作者
一般讲:unsigned long 的内码是32个二机制位,而float的内码是16个二机制位,经过转换之后必然有精度损失。
香水城 发表于 2012-2-23 15:27

IEEE-754标准float应该是1位符号,8位阶码,23位尾数,相当于7位十进制精度。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
香水城 + 2 拿标准说话,有说服力!
5
wangc111| | 2012-2-23 15:51 | 只看该作者
了解下

使用特权

评论回复
6
香水城| | 2012-2-23 16:01 | 只看该作者
IEEE-754标准float应该是1位符号,8位阶码,23位尾数,相当于7位十进制精度。


李富贵 发表于 2012-2-23 15:35


是的,我在3楼的表述有误,:L

使用特权

评论回复
7
sinadz| | 2012-2-23 16:27 | 只看该作者
浮点数不能做比较

使用特权

评论回复
8
motor666|  楼主 | 2012-2-24 13:31 | 只看该作者
感谢各位指点,明白原因了,我不是学软件的,可现在又必须得做一些软件,各位能否再指点一下,无符号long型的数怎么变成浮点数,因为采集的数据总得拿过来运算,这两种数肯定有一个接口吧。

使用特权

评论回复
9
香水城| | 2012-2-24 13:47 | 只看该作者
“无符号long型的数怎么变成浮点数”,LZ位就是答案。

但是请记住变换完后,如果再变回去,结果不一定与原来相等。

例:unsigned long A, B; float X;
   X = A;
   B = X
   if (A == B)   // 这里可能比较相等,也可能比较不相等。

使用特权

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

本版积分规则

173

主题

419

帖子

1

粉丝