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'语句.
我怎么能纠正这种差异?还有其他方法可以求和吗?
在双精度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
插入十进制数并查看第二行和第三行,它显示数字在内存中的实际表示方式.这是德尔福,但Double并Single是相同的德尔福和可能所有的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)