为什么这个程序不打印值 2 ..我想要的输出是 2 ..这里的错误在哪里
Why this programme doesn't print the value 2 .. My desire output is 2.. where is the error here
示例代码在这里,期望输出是2
::
#include <stdio.h>
int main()
{
double i, a, b;
int j;
for (i = 0; i <= 3; i = i + .20)
{
if (i == 2)
{
printf("I=%lf\n", i);
}
}
}
当我使用
#include <stdio.h>
int main()
{
double i, a, b;
int j;
for (i = 0; i <= 3; i = i + .25)
{
if (i == 2)
{
printf("I=%lf\n", i);
}
}
}
有效;但在第一种情况下,它不起作用。为什么 ??
简短的回答是,在 for
循环中使用浮动控制变量是不明智的...比较浮动值是否相等更不明智。
由于浮点数存储为尾数和指数,您的0.20000000
很可能是0.199999999...9
或020000000...01
因此比较失败。
通常,0.25
和 2.000
将准确存储,因为它们是 2 的幂。因此 0.25
的步骤按预期工作。
MISRA C:2012 有规则 14.1 来防止使用 float
或 doubles
作为循环计数器...并且之前有一个规则来防止测试 float
/ double
平等 - 也许我们应该恢复该规则。
示例代码在这里,期望输出是2
::
#include <stdio.h>
int main()
{
double i, a, b;
int j;
for (i = 0; i <= 3; i = i + .20)
{
if (i == 2)
{
printf("I=%lf\n", i);
}
}
}
当我使用
#include <stdio.h> int main() { double i, a, b; int j; for (i = 0; i <= 3; i = i + .25) { if (i == 2) { printf("I=%lf\n", i); } } }
有效;但在第一种情况下,它不起作用。为什么 ??
简短的回答是,在 for
循环中使用浮动控制变量是不明智的...比较浮动值是否相等更不明智。
由于浮点数存储为尾数和指数,您的0.20000000
很可能是0.199999999...9
或020000000...01
因此比较失败。
通常,0.25
和 2.000
将准确存储,因为它们是 2 的幂。因此 0.25
的步骤按预期工作。
MISRA C:2012 有规则 14.1 来防止使用 float
或 doubles
作为循环计数器...并且之前有一个规则来防止测试 float
/ double
平等 - 也许我们应该恢复该规则。