[STM8] 奇葩问题

[复制链接]
4870|41
 楼主| dqgcs123 发表于 2014-12-22 12:41 | 显示全部楼层
排山倒海 发表于 2014-12-22 12:39
深圳
有什么想法?

。。。这也太巧了,因为虽然我没有提出float直接和0比较的问题,但是我提问的这段代码还真这么写了,我还以为你是我某个同事:funk:
排山倒海 发表于 2014-12-22 12:59 | 显示全部楼层
dqgcs123 发表于 2014-12-22 12:41
。。。这也太巧了,因为虽然我没有提出float直接和0比较的问题,但是我提问的这段代码还真这么写了,我还 ...

如果和你公司内部情况很接近可以理解为类似“本剧纯属虚构,如有雷同,纯属巧合”,我们公司属于家电控制板行业,在很多人眼里是没有高大上技术含量的,我从来没有在实际项目中用过float变量,对本贴只能是说是“旁观者清”甚至是碰上“狗屎运”提一下自己的愚见。
 楼主| dqgcs123 发表于 2014-12-22 13:05 | 显示全部楼层
排山倒海 发表于 2014-12-22 12:59
如果和你公司内部情况很接近可以理解为类似“本剧纯属虚构,如有雷同,纯属巧合”,我们公司属于家电控制 ...

不至于没用过float变量吧。。。。。。不需要交采计算么?
bear1 发表于 2014-12-22 14:47 来自手机 | 显示全部楼层
排山倒海 发表于 2014-12-18 12:53
我看到《高质量C++ C编程指南》等资料网页有建议不要用浮点变量与零值的比较,建议:
if ((x>=-EPSINON) && ...

为什么浮点变量不能与0比较?
排山倒海 发表于 2014-12-22 18:05 | 显示全部楼层
bear1 发表于 2014-12-22 14:47
为什么浮点变量不能与0比较?

《高质量C++ C编程指南》中解释是“千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。”

老外的《你必须知道的495个C语言问题》也有类似说明:
14.5 有什么好的方法来验对浮点数在“足够接近” 情况下的等值?
浮点数的定义决定它的绝对精确度会随着其代表的值变化, 所以比较两个浮点数的最好方法就要利用一个精确的阈值。这个阈值和作比较的浮点数值大小有关。不要用下面的代码:
double a, b;
...
if (a == b) /* 错! */
要用类似下列的方法:
#include <math.h>
if (fabs(a - b) <= epsilon * fabs(a))
epsilon 被赋为一个选定的值来控制“接近度”。你也要确定a 不会为0。
参考资料: [Knuth, Sec. 4.2.2 pp. 217-8]。

我猜测(我没有用过浮点变量也没验证过)可能单个浮点变量可以和0比较,但是两个变量相减再和0 比较估计真的有问题,如果在这方面没有这个意识后果怎样估计要看运气了。
排山倒海 发表于 2014-12-22 18:11 | 显示全部楼层
dqgcs123 发表于 2014-12-22 13:05
不至于没用过float变量吧。。。。。。不需要交采计算么?

建议你看《从单片机初学者迈向单片机工程师.doc》“一个有关0.0625℃的运算想到的问题”和《8051单片机彻底研究经验篇》关于数学算法和数值分析。我先去吃饭了,晚上还有事,以后有空再聊。
 楼主| dqgcs123 发表于 2014-12-23 11:49 | 显示全部楼层
排山倒海 发表于 2014-12-22 18:11
建议你看《从单片机初学者迈向单片机工程师.doc》“一个有关0.0625℃的运算想到的问题”和《8051单片机彻 ...

你现在是做什么的?51单片机开发么?
仙人球W 发表于 2014-12-23 11:53 | 显示全部楼层
声明没有类型 当整形 int
仙人球W 发表于 2014-12-23 11:55 | 显示全部楼层
《C语言深度剖析》看看吧

921665973 发表于 2014-12-23 12:00 | 显示全部楼层
编译器比较挑吧。。。良好的编程习惯,就没有编译器挑了
排山倒海 发表于 2014-12-23 12:45 | 显示全部楼层
dqgcs123 发表于 2014-12-23 11:49
你现在是做什么的?51单片机开发么?

现在工作是主管,平时不负责实际项目,忙时偶尔做功能板。
以前用过51不是很深入熟悉,近几年实际项目用合泰、三星和PIC单片机的比较多。
 楼主| dqgcs123 发表于 2014-12-23 12:48 | 显示全部楼层
排山倒海 发表于 2014-12-23 12:45
现在工作是主管,平时不负责实际项目,忙时偶尔做功能板。
以前用过51不是很深入熟悉,近几年实际项目用 ...

原来是项目负责人了,厉害:lol
排山倒海 发表于 2014-12-28 23:00 | 显示全部楼层
dqgcs123 发表于 2014-12-23 12:48
原来是项目负责人了,厉害

“厉害”?我都不知道说什么好。如果从软件和硬件两方面综合考虑我可能有点优势,如果单单从某方面看我没有很深入专业的。
排山倒海 发表于 2014-12-28 23:31 | 显示全部楼层
《8051单片机彻底研究经验篇》关于数学算法和数值分析:
《8051单片机彻底研究经验篇》数学算法和数值分析1.jpg

《8051单片机彻底研究经验篇》数学算法和数值分析2.jpg
《8051单片机彻底研究经验篇》数学算法和数值分析3.jpg
小浣熊 发表于 2014-12-29 18:02 | 显示全部楼层
学习了
为爱一拼 发表于 2014-12-29 18:29 | 显示全部楼层
szjlj168 发表于 2014-12-30 16:06 | 显示全部楼层
编译器不报错不代表没出错!
再就是找bug最好还是照实写,
举例子就没真实性了。

解决办法:
规范自己的代码,让编译器哭去吧!

学习了
zh113214 发表于 2014-12-30 18:41 | 显示全部楼层
不知道楼主所谓的这个奇葩问题解决没有呢
 楼主| dqgcs123 发表于 2014-12-31 09:43 | 显示全部楼层
zh113214 发表于 2014-12-30 18:41
不知道楼主所谓的这个奇葩问题解决没有呢

早就解决了,加个float就行了。
只是这个bug的存在比较费解而已
zxm19820916 发表于 2014-12-31 10:17 | 显示全部楼层
排山倒海 发表于 2014-12-18 12:53
我看到《高质量C++ C编程指南》等资料网页有建议不要用浮点变量与零值的比较,建议:
if ((x>=-EPSINON) && ...

这个提得好,你确定A真的为0吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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