C - 双精度求和

Nan*_*nik -2 c 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);
Run Code Online (Sandbox Code Playgroud)

我的测试输入:

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


我怎么能纠正这种差异?还有其他方法可以求和吗?

xan*_*tos 5

在双精度IEEE 754二进制浮点格式(在英特尔和其他处理器上使用的格式)的世界中0.1 + 0.2 == 0.30000000000000004:-)而且0.30000000000000004 != 0.3(注意在doubles 的奇妙世界中,0.1,0.2和0.3不存在为"精确" "数量.有一些非常靠近它们的双数字,但是如果你用它们完全精确地打印它们,它们将不是0.1,0.2和0.3)

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

插入十进制数并查看第二行和第三行,它显示数字在内存中的实际表示方式.这是德尔福,但DoubleSingle是相同的德尔福和可能所有的C编译器针对英特尔处理器(他们被称为double以及float在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;
}
Run Code Online (Sandbox Code Playgroud)

输出:
3.00000000000000044409e-01
2.99999999999999988898e-01

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