C ++中while循环中的浮点错误

时间:2013-10-17 09:17:50

标签: c++ c compilation

int main()
 {
      float x = k ; // k is some fixed positive value 
      while(x>0)
           x-- ;
      return 0 ;
 }

以上程序可以进入无限循环吗?

3 个答案:

答案 0 :(得分:14)

是的,这是可能的。以最大浮点数为例。

正如此代码所示,对于最大的浮动mm等于m - 1

#include <iostream>
#include <limits>

int main() {
    auto m = std::numeric_limits<float>::max();
    auto l = m;
    l--;
    std::cerr << (m == l) << "\n";
}

演示:http://ideone.com/Wr9zdN

因此,使用此起始值,循环将是无限的。

为什么?

float(与其他所有内置类型一样)具有有限的精度。要使x - 1代表x以外的数字,小于x的最大数字之差必须小于2.

现在让我们计算m,最大浮点数和x之间的差异,最大浮点数,严格小于m

#include <iostream>
#include <cmath>
#include <limits>

int main() {
    auto m = std::numeric_limits<float>::max();
    std::cout << "float max: " << m << "\n";
    auto x = std::nextafter(m, 0.0f);
    std::cout << "biggest value less than max: " << x << "\n";
    auto d = m - x;
    std::cout << "the difference: " << d << "\n";
}

演示:http://ideone.com/VyNgtE

事实证明,这两个数字之间存在巨大的2.02824e+31差距。远远大于1. 1太小了,无法发挥作用。

答案 1 :(得分:5)

是的,它可以。例如kFLT_MAX。没有足够的精确度来处理这么大的数字之间的这么小的距离。

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

int main()
{
    float a = FLT_MAX;
    float b = a - 1;
    printf("%.10f\n", a - b);

    return 0;
}

输出:

0.0000000000

答案 2 :(得分:4)

我认为它实际上可以。如果k足够大,四舍五入将吞噬你的减量。