当我使用 float
而不是 double
时出现奇怪的输出
#include <stdio.h>
void main()
{
double p,p1,cost,cost1=30;
for (p = 0.1; p < 10;p=p+0.1)
{
cost = 30-6*p+p*p;
if (cost<cost1)
{
cost1=cost;
p1=p;
}
else
{
break;
}
printf("%lf\t%lf\n",p,cost);
}
printf("%lf\t%lf\n",p1,cost1);
}
在 p
= 3 时给出预期的输出;
但是当我使用 float
时,输出有点奇怪。
#include <stdio.h>
void main()
{
float p,p1,cost,cost1=40;
for (p = 0.1; p < 10;p=p+0.1)
{
cost = 30-6*p+p*p;
if (cost<cost1)
{
cost1=cost;
p1=p;
}
else
{
break;
}
printf("%f\t%f\n",p,cost);
}
printf("%f\t%f\n",p1,cost1);
}
为什么在 2.7 之后第二种情况下 p
的增量变得奇怪?
最佳答案
发生这种情况是因为 float
和 double
数据类型以 2 为基数存储数字。大多数以 10 为基数的数字无法准确存储。使用 float
时,舍入误差加起来更快。由于这个原因,在内存有限的嵌入式应用程序之外,使用 double
通常更好,或者至少更容易。
要查看 double
类型的情况,请考虑以下代码的输出:
#include <stdio.h>
int main(void)
{
double d = 0.0;
for (int i = 0; i < 100000000; i++)
d += 0.1;
printf("%f\n", d);
return 0;
}
在我的电脑上,它输出 9999999.981129。所以经过 1 亿次迭代后,舍入误差使结果相差 0.018871。
有关 float 据类型如何工作的更多信息,请阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic .或者,正如 akira 在评论中提到的那样,请参阅 Floating-Point Guide .
关于c - 使用 float 而不是 double 时出现奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28512650/