这里没有软件测试的泛泛理论,只有博主的最佳实践。
博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。
本博的测试文章均为作者原创,转载请务必注明出处。
C语言编程规则解析-13.3
上一篇 /
下一篇 2008-02-21 11:26:26
/ 个人分类:静态分析
本文章系列中提到的规则大部分取自于MISRA-C:2004及GJB5369-2005。
13.3浮点表达式不能用相等或不相等来测试。
Floating-point expressions shall not be tested for equality or inequality.;
解释:
由于计算机精度的限制,对浮点型的表达式(包括变量)使用相等或不相等的测试是非常危险的,所以应该避免浮点数值的比较。正确的做法应该是将相等(= =)或不相等(!=)的比较转化成(>= && <=)的方式。
例如:最简单的例子,浮点数和零值的比较
假如浮点变量的名字为x,应当将
if (x = = 0.0)//隐含错误的比较
修改为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度,通常可以为1e-6)。
举例:
void foo() {
float x, y;
if (x == y); // Violation
if (x == 0.0f); // Violation
}
修改成
void foo( float epsilon ) {
float x, y;
if (x - epsilon <= y && y <= x + epsilon); // OK
if (-epsilon <= x && x <= epsilon); // OK
}
引申:
13.4一个‘for’语句的控制表达式不可以包含浮点类型的对象。
The controlling expression of a for statement shall not contain any objects of floating type;
For循环通常需要固定循环的次数,如果在for语句的表达式中使用浮点型的变量,由于精度的关系,有可能会使循环的次数和预想的不一致,还可能会导致一个死循环。例如:
Float I;
For(I =1.0f; I <=10.0f; i++)
{… }
程序员本义可能是想循环10次,但实际情况可能不是这样。
注:以上部分内容参考了林锐博士的《高质量C++/C编程指南》1.0版本,特此感谢!
收藏
举报
TAG:
静态分析