c - 使用 float 而不是 double 时出现奇怪的输出

标签 c floating-point floating-point-precision

当我使用 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);
}

As Expected

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);
}

Strange increment style

为什么在 2.7 之后第二种情况下 p 的增量变得奇怪?

最佳答案

发生这种情况是因为 floatdouble 数据类型以 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/

相关文章:

python - 如果元素等于某个容差,我可以使用 numpy 快速设置 float 差异吗

c++ - double 会溢出吗?

c - 在 C 中使用 "" block 内的整数

floating-point - x86_64 和 ARMv8.2-A 之间不同的浮点计算结果

javascript - 在 Node-FFI 中使用 SendInput

java - Android Studio - 尽管其中没有任何零值,但计算结果为 0

java - 双倍乘以 100 然后转换为 long 给出了错误的值

python - Numpy 求和函数返回 1.67772e+07

c - 如何在 Linux 上用 C 获取 CPU 信息,例如内核数?

objective-c - 如何标记返回类型为不返回的函数?