c++ - C++ 中 Double 类型值的减法

标签 c++ c double

我想用 C++ 从一个大 double 中减去一个小 double 。这是我的代码

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

然而,这三个应该是不同的。为什么 double 类型的减法会这样?

最佳答案

166666166667000000 和 10 都可以用 double 表示。减法的实数运算结果,166666166666999990,不是。严格小于 166666166667000000 的最大双数是 166666166666999968。

166666166666999990 比 166666166666999968 更接近 166666166667000000,因此 166666166667000000 是减法的舍入到最近的 double 结果。

如果你只是做一个小数减法,你可以忽略这个问题。如果您做的小数减法足够多以至于它们的累积效应很重要,则您需要重新安排您的计算。

关于c++ - C++ 中 Double 类型值的减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26977418/

相关文章:

java - (Java) 为什么写0x12.2P2正确但写0x12.2F不正确?

java - float 类型时出错,double 类型时无错误

c++ - 为什么 cout 在与三元和 int 一起使用时打印 char 的 ascii 值?

c++ - (C++) 与结构和函数参数有关的简单问题

c - 从单链表的末尾迭代到开头而不反转它

c - Text::JaroWinkler::strcmp95 的第三个参数是什么?

无法安装我的驱动程序

xcode - 类型 'Double' 不符合协议(protocol) 'Sequence Type'

C++ 在成员函数范围内使用语句

c++ - 使用事件杀死线程的时间不一致