int main()
{
float x = k ; // k is some fixed positive value
while(x>0)
x-- ;
return 0 ;
}
上面的程序可以无限循环吗?
int main()
{
float x = k ; // k is some fixed positive value
while(x>0)
x-- ;
return 0 ;
}
上面的程序可以无限循环吗?
是的,这是可能的。以最大浮动为例。
正如这段代码所示,对于最大的 float 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";
}
演示: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 太小而无法产生影响。
是的,它可以。如果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
我认为它实际上可以。如果k
足够大,四舍五入会吞噬你的减量。