我试图从C ++中的一个大的双数中减去一个小的双数。这是我的代码
int main()
{
double a=166666166667000000.000000;
double b=1.0;
double c=4.0;
double d=10.0;
double ans_b=a-b;
double ans_c=a-c;
double ans_d=a-d;
printf("%f\n%f\n%f\n",ans_b,ans_c,ans_d);
return 0;
}
本规范给出了以下输出 -
166666166667000000.000000
166666166667000000.000000
166666166667000000.000000
然而,这三者应该是不同的。为什么双重类型的减法表现得这样?
答案 0 :(得分:1)
166666166667000000和10都可以在double中完全表示。减法的实数算术结果166666166666999990不是。最大双倍严格小于166666166667000000是166666166666999968。
166666166666999990更接近166666166667000000而不是166666166666999968,因此166666166667000000是减法的舍入到最接近的双倍结果。
如果您只是进行一次小数减法,则可以忽略该问题。如果你做了足够的小数量的减法,他们的累积效果很重要,你需要重新安排你的计算。