我对 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,但是 Double
和 Single
对于 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/