C - double 求和

标签 c double precision

我对 double 格式的精度有疑问。

<小时/>

示例:

double K=0, L=0, M=0;
scanf("%lf %lf %lf", &K, &L, &M);
if((K+L) <= M) printf("Incorrect input");
else printf("Right, K=%f, L=%f, M=%f", K, L, M);
<小时/>

我的测试输入:

K = 0.1,L = 0.2,M = 0.3 -> 条件,但转到 'else' 语句。

<小时/>

如何纠正这种差异?还有其他求和方法吗?

最佳答案

在 double IEEE 754 二进制浮点格式(Intel 和其他处理器上使用的格式)的世界中 0.1 + 0.2 == 0.30000000000000004 :-) 和 0.30000000000000004 != 0.3 (请注意,在 double 的奇妙世界中,0.1、0.2 和 0.3 并不作为“精确”数量存在。有一些 double 数字非常接近它们,但是如果你以全精度打印它们,它们就不会是 0.1、0.2 和 0.3)

要笑一点,试试这个:http://pages.cs.wisc.edu/~rkennedy/exact-float

插入一个十进制数,看看第二行和第三行,它显示了该数字在内存中的实际表示方式。它适用于 Delphi,但是 DoubleSingle 对于 Delphi 以及可能对于 Intel 处理器的所有 C 编译器来说是相同的(它们被称为 double 和C 中的浮点)

如果您想亲自尝试一下,请查看此 http://ideone.com/WEL7h

#include <stdio.h>

int main()
{
    double d1 = (0.1 + 0.2);
    double d2 = 0.3;

    printf("%.20e\n%.20e", d1, d2);

    return 0;
}

输出:
3.00000000000000044409e-01
2.99999999999999988898e-01

(请注意,输出取决于编译器。根据选项,0.1 + 0.2 可能会被编译并舍入为 0.3)

关于C - double 求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754590/

相关文章:

python - 无法打开带有空格的train.txt "My Drive"He

java - 少了一步? loadLibrary() 的参数需要填写什么

java - 为什么 Java 除以 0.0 时不抛出异常?

c++ - 如何限制计算的浮点值的小数位数?

c - C语言中如何除法?

mysql - 是否可以在 MySQL 中将 DECIMAL 转换为 DOUBLE?

java - 空指针异常的解释

c++ - 使用 clock() 函数安排任务时出现问题

math - float 学有问题吗?

c - 如何在 C 中创建 Linux 管道示例