在下面您可以找到带有for循环的基本C ++练习,问题是:循环运行后i的值是多少。 (显然,该值为5。)
我的问题是,在第5次运行(i = 5)时,a的值为100,因为条件a <100,循环是否应该停止? a乘以10后不检查条件吗? (因此a已经是100之后)
如果我在循环退出后检查a的值,它将是1000。我很困惑。为什么循环不止于100?
#include <iostream>
using namespace std;
int main(void) {
float a;
int i = 0;
for(a = 0.01; a < 1e2; a *= 1e1)
++i;
return 0;
}
答案 0 :(得分:7)
该练习旨在显示float
(和double
等,通常是浮点数)不不具有您所看到的确切十进制值程序文本。
0.01
(十进制)不能以所使用的二进制浮点格式精确表示,因此将10乘以五将不能得到准确的100.0
。
答案 1 :(得分:2)
如果不知道平台上的浮点实现的详细信息,就无法确切知道此代码将发生什么; C ++标准使此刻意灵活。
实质上,0.01
可以是最接近float
文字的double
的近似值。因此可以提前或以其他方式满足停止条件a < 1e2
。
请注意,0.01
与1e1
一起是类型为double
的文字。
因此,向float
的转换使事情变得更加复杂。然后要考虑浮点严格度。
简而言之:不要在循环中使用浮点作为“索引”。