打印
[STM8]

doublue类型赋值问题

[复制链接]
1347|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oldpig|  楼主 | 2016-7-5 14:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目过程中遇到件事,很不理解,即给double型变量赋值有偏差,把无关语句去掉后如下:

double frequence;  // 改在main()中定义也无法解决问题
main()
{
         frequence = 5555.12;   
         
         while(1) ;
}

进入debug模式下跟踪查看,frequence=5555.1196,赋予他值也同样有偏差,例如frequence = 5555.05,得到的却是5555.0498,   请问怎么回事? 我用的是STM8S103K3, COSMIC+STVD4.3.1     谢谢!
评论
xwj 2016-7-7 09:22 回复TA
而用float类型赋值后 查看是5555.12,加0也是这个。所以应该是你的编译器问题。不然即使除不尽也应该显示5555.1199才对,只是9的个数不同,而不应该1196 
xwj 2016-7-7 09:15 回复TA
VC下是5555.1199999999999,应该是你的编译器把double简化成float(32位)了,你去检查下编译器配置先 
沙发
lxyppc| | 2016-7-5 15:20 | 只看该作者
正常现象

使用特权

评论回复
板凳
Bermanrep| | 2016-7-5 15:28 | 只看该作者
可能和单片机的结构有关系

使用特权

评论回复
地板
oldpig|  楼主 | 2016-7-5 20:24 | 只看该作者
应该不至于吧?如果确实如此,该怎么解决呢?

使用特权

评论回复
5
mmuuss586| | 2016-7-5 20:51 | 只看该作者

正常的呀;
或者你换IAR试下

使用特权

评论回复
6
oldpig|  楼主 | 2016-7-5 22:26 | 只看该作者
好的,我换IAR试试。

另外,刚才我把double换为float型, 并在工程设置->link页中勾选了 float,问题依然存在。按道理,float应该是没问题的啊?

使用特权

评论回复
7
xwj| | 2016-7-5 22:43 | 只看该作者
浮点数的小数部分也是二进制的,只能按1/2、1/4、1/8、1/16... 这样加起来,有的数就必然有误差,比如0.5、0.25、0.125、0.0625、0.03125 什么的可以准确,但是0.05就是不准确的了。而对于0.003之类的,那是永远除不尽的。

doublue类型有52位数字+11位指数构成,虽然不能没误差,但按说也不应该精度这么低,至少得有好多好多位小数呢。

你在尾部加0试试,不行的话就得怀疑编译器了。

使用特权

评论回复
8
oldpig|  楼主 | 2016-7-6 08:31 | 只看该作者
谢谢楼上!按你的回答试了下,确实1/2、1/4、1/8、1/16...等没有问题,其他的数值即使在末尾添0也不行。但是,除了cosmic,还有什么其他的编译器可以推荐一下吗?

使用特权

评论回复
9
oldpig|  楼主 | 2016-7-6 23:10 | 只看该作者
刚才准备结帖,但总提示说分数未分配完或分配不对,咋整?

使用特权

评论回复
10
戈卫东| | 2016-7-7 03:34 | 只看该作者
8位MCU上double可能仍然是32BIT

使用特权

评论回复
11
zchong| | 2016-7-7 08:17 | 只看该作者
截断误差

使用特权

评论回复
评论
xwj 2016-7-7 09:28 回复TA
不止是截断误差,正常截断的话double应是5555.1199999999999,即使简化成float也该5555.1199,而不应是5555.1196 
12
oldpig|  楼主 | 2016-7-8 22:10 | 只看该作者
好的,谢谢!

使用特权

评论回复
13
oldpig|  楼主 | 2016-7-8 22:20 | 只看该作者
结帖的分数分配有什么规则吗?刚才想结帖,在某个ID的帖子旁的空白框里填上分数,其他ID的帖子旁的空白框里填0,但还是反馈说分数未分配完或分配不对

使用特权

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

本版积分规则

15

主题

47

帖子

1

粉丝