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

上面的程序可以无限循环吗?

4

3 回答 3

14

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

正如这段代码所示,对于最大的 float 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 太小而无法产生影响。

于 2013-10-17T09:26:26.070 回答
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
于 2013-10-17T09:23:48.320 回答
4

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

于 2013-10-17T09:22:57.110 回答