以下代码有哪些潜在的缺陷

时间:2015-05-01 14:54:59

标签: c++ c

考虑一个简单的函数来划分两个浮点数,

float floatDiv(float x, float y)
{
    float z;
    z = x/y;
    return z;
}

所有我能想到的是y==0它有未定义的行为。还有其他人?

2 个答案:

答案 0 :(得分:3)

溢出和下溢是两个陷阱,其中除法的真实结果不能保存在数据类型中。这个例子显示了两者。在第二种下溢情况下,该值太小而无法表示,变为0.0

#include <stdio.h>
#include <float.h>

int main(){
    float large, small;
    large = FLT_MAX / FLT_MIN;
    printf ("%f\n", (double)large);

    small = FLT_MIN / FLT_MAX;
    if (small == 0.0f) printf("Zero\n");
    return 0;
}

节目输出:

1.#INF00
Zero

其中一个可能作为计算的中间步骤发生,因此从预期结果的范围可能不明显。其中一个实际的例子是计算指数级数与总计+-项的总和,例如sin(x)的系列。

答案 1 :(得分:1)

使用浮点的一个缺陷是准确性,因为与未准确表示的值相比,可以精确表示的值集非常小。

鉴于


  z = x / y;
表达式:
  z * y
可能不等于x并且取决于浮点表示的精度能力。