打印
[STM8]

奇葩问题

[复制链接]
楼主: dqgcs123
手机看帖
扫描二维码
随时随地手机跟帖
21
dqgcs123|  楼主 | 2014-12-22 12:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
排山倒海 发表于 2014-12-22 12:39
深圳
有什么想法?

。。。这也太巧了,因为虽然我没有提出float直接和0比较的问题,但是我提问的这段代码还真这么写了,我还以为你是我某个同事:funk:

使用特权

评论回复
22
排山倒海| | 2014-12-22 12:59 | 只看该作者
dqgcs123 发表于 2014-12-22 12:41
。。。这也太巧了,因为虽然我没有提出float直接和0比较的问题,但是我提问的这段代码还真这么写了,我还 ...

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

使用特权

评论回复
23
dqgcs123|  楼主 | 2014-12-22 13:05 | 只看该作者
排山倒海 发表于 2014-12-22 12:59
如果和你公司内部情况很接近可以理解为类似“本剧纯属虚构,如有雷同,纯属巧合”,我们公司属于家电控制 ...

不至于没用过float变量吧。。。。。。不需要交采计算么?

使用特权

评论回复
24
bear1| | 2014-12-22 14:47 | 只看该作者
排山倒海 发表于 2014-12-18 12:53
我看到《高质量C++ C编程指南》等资料网页有建议不要用浮点变量与零值的比较,建议:
if ((x>=-EPSINON) && ...

为什么浮点变量不能与0比较?

使用特权

评论回复
25
排山倒海| | 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 比较估计真的有问题,如果在这方面没有这个意识后果怎样估计要看运气了。

使用特权

评论回复
26
排山倒海| | 2014-12-22 18:11 | 只看该作者
dqgcs123 发表于 2014-12-22 13:05
不至于没用过float变量吧。。。。。。不需要交采计算么?

建议你看《从单片机初学者迈向单片机工程师.doc》“一个有关0.0625℃的运算想到的问题”和《8051单片机彻底研究经验篇》关于数学算法和数值分析。我先去吃饭了,晚上还有事,以后有空再聊。

使用特权

评论回复
27
dqgcs123|  楼主 | 2014-12-23 11:49 | 只看该作者
排山倒海 发表于 2014-12-22 18:11
建议你看《从单片机初学者迈向单片机工程师.doc》“一个有关0.0625℃的运算想到的问题”和《8051单片机彻 ...

你现在是做什么的?51单片机开发么?

使用特权

评论回复
28
仙人球W| | 2014-12-23 11:53 | 只看该作者
声明没有类型 当整形 int

使用特权

评论回复
29
仙人球W| | 2014-12-23 11:55 | 只看该作者
《C语言深度剖析》看看吧

使用特权

评论回复
30
921665973| | 2014-12-23 12:00 | 只看该作者
编译器比较挑吧。。。良好的编程习惯,就没有编译器挑了

使用特权

评论回复
31
排山倒海| | 2014-12-23 12:45 | 只看该作者
dqgcs123 发表于 2014-12-23 11:49
你现在是做什么的?51单片机开发么?

现在工作是主管,平时不负责实际项目,忙时偶尔做功能板。
以前用过51不是很深入熟悉,近几年实际项目用合泰、三星和PIC单片机的比较多。

使用特权

评论回复
32
dqgcs123|  楼主 | 2014-12-23 12:48 | 只看该作者
排山倒海 发表于 2014-12-23 12:45
现在工作是主管,平时不负责实际项目,忙时偶尔做功能板。
以前用过51不是很深入熟悉,近几年实际项目用 ...

原来是项目负责人了,厉害:lol

使用特权

评论回复
33
排山倒海| | 2014-12-28 23:00 | 只看该作者
dqgcs123 发表于 2014-12-23 12:48
原来是项目负责人了,厉害

“厉害”?我都不知道说什么好。如果从软件和硬件两方面综合考虑我可能有点优势,如果单单从某方面看我没有很深入专业的。

使用特权

评论回复
34
排山倒海| | 2014-12-28 23:31 | 只看该作者
《8051单片机彻底研究经验篇》关于数学算法和数值分析:




使用特权

评论回复
35
小浣熊| | 2014-12-29 18:02 | 只看该作者
学习了

使用特权

评论回复
36
为爱一拼| | 2014-12-29 18:29 | 只看该作者
帮顶

使用特权

评论回复
37
szjlj168| | 2014-12-30 16:06 | 只看该作者
编译器不报错不代表没出错!
再就是找bug最好还是照实写,
举例子就没真实性了。

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

学习了

使用特权

评论回复
38
zh113214| | 2014-12-30 18:41 | 只看该作者
不知道楼主所谓的这个奇葩问题解决没有呢

使用特权

评论回复
39
dqgcs123|  楼主 | 2014-12-31 09:43 | 只看该作者
zh113214 发表于 2014-12-30 18:41
不知道楼主所谓的这个奇葩问题解决没有呢

早就解决了,加个float就行了。
只是这个bug的存在比较费解而已

使用特权

评论回复
40
zxm19820916| | 2014-12-31 10:17 | 只看该作者
排山倒海 发表于 2014-12-18 12:53
我看到《高质量C++ C编程指南》等资料网页有建议不要用浮点变量与零值的比较,建议:
if ((x>=-EPSINON) && ...

这个提得好,你确定A真的为0吗?

使用特权

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

本版积分规则