这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

C语言编程规则解析-13.3

上一篇 / 下一篇  2008-02-21 11:26:26 / 个人分类:静态分析

本文章系列中提到的规则大部分取自于MISRA-C:2004GJB5369-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: 静态分析

 

评分:0

我来说两句

Open Toolbar