int main()
{
float x = k ; // k is some fixed positive value
while(x>0)
x-- ;
return 0 ;
}
以上程序可以进入无限循环吗?
答案 0 :(得分:14)
是的,这是可能的。以最大浮点数为例。
正如此代码所示,对于最大的浮动m
,m
等于m - 1
:
#include <iostream>
#include <limits>
int main() {
auto m = std::numeric_limits<float>::max();
auto l = m;
l--;
std::cerr << (m == l) << "\n";
}
因此,使用此起始值,循环将是无限的。
为什么?
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";
}
事实证明,这两个数字之间存在巨大的2.02824e+31
差距。远远大于1. 1太小了,无法发挥作用。
答案 1 :(得分:5)
是的,它可以。例如k
为FLT_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
足够大,四舍五入将吞噬你的减量。