[STM8] doublue类型赋值问题

[复制链接]
 楼主| 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
而用float类型赋值后 查看是5555.12,加0也是这个。所以应该是你的编译器问题。不然即使除不尽也应该显示5555.1199才对,只是9的个数不同,而不应该1196  发表于 2016-7-7 09:22
xwj
VC下是5555.1199999999999,应该是你的编译器把double简化成float(32位)了,你去检查下编译器配置先  发表于 2016-7-7 09:15
lxyppc 发表于 2016-7-5 15:20 来自手机 | 显示全部楼层
正常现象
Bermanrep 发表于 2016-7-5 15:28 | 显示全部楼层
可能和单片机的结构有关系
 楼主| oldpig 发表于 2016-7-5 20:24 | 显示全部楼层
应该不至于吧?如果确实如此,该怎么解决呢?
mmuuss586 发表于 2016-7-5 20:51 | 显示全部楼层

正常的呀;
或者你换IAR试下
 楼主| oldpig 发表于 2016-7-5 22:26 | 显示全部楼层
好的,我换IAR试试。

另外,刚才我把double换为float型, 并在工程设置->link页中勾选了 float,问题依然存在。按道理,float应该是没问题的啊?
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试试,不行的话就得怀疑编译器了。
 楼主| oldpig 发表于 2016-7-6 08:31 | 显示全部楼层
谢谢楼上!按你的回答试了下,确实1/2、1/4、1/8、1/16...等没有问题,其他的数值即使在末尾添0也不行。但是,除了cosmic,还有什么其他的编译器可以推荐一下吗?

 楼主| oldpig 发表于 2016-7-6 23:10 | 显示全部楼层
刚才准备结帖,但总提示说分数未分配完或分配不对,咋整?
戈卫东 发表于 2016-7-7 03:34 | 显示全部楼层
8位MCU上double可能仍然是32BIT
zchong 发表于 2016-7-7 08:17 来自手机 | 显示全部楼层
截断误差

评论

xwj
不止是截断误差,正常截断的话double应是5555.1199999999999,即使简化成float也该5555.1199,而不应是5555.1196  发表于 2016-7-7 09:28
 楼主| oldpig 发表于 2016-7-8 22:10 | 显示全部楼层
好的,谢谢!
 楼主| oldpig 发表于 2016-7-8 22:20 | 显示全部楼层
结帖的分数分配有什么规则吗?刚才想结帖,在某个ID的帖子旁的空白框里填上分数,其他ID的帖子旁的空白框里填0,但还是反馈说分数未分配完或分配不对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

47

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部