【问题标题】:Loss of precision on adding doubles?添加双精度会丢失精度?
【发布时间】:2013-06-17 07:13:01
【问题描述】:

伙计们!我遇到了一个小问题:我正在用三个双精度值做一个简单的加法。结果的精度小于使用的值。

double minutes = 3;
minutes = minutes / (24.0*60.0);  // contains 0.00208333
double hours = 3;
hours = hours / 24.0; // contains 0.125
double days = 3; // contains 3 

double age = days + hours + minutes; // result is 3.12708 

我没有办法避免这种行为。

【问题讨论】:

  • 如何检查变量的值?
  • 有什么问题?计算似乎没问题。你如何打印结果?你想打印更多的数字吗?
  • 请注意:1) 根据您输出值的方式,您可能看不到所有有效数字,并且 2) 双精度值无法准确表示 0.1 之类的值
  • 回复:精度:所有四个都打印六个有效数字。区别在哪里?
  • 如何得到结果? printf()%g%f?

标签: c++ double precision addition


【解决方案1】:

您帖子中的 cmets 所说的计算似乎没有任何问题。

如果您想查看更精确的信息,请考虑查找 setprecision()

【讨论】:

  • 计算是正确的,确实。我通过使用 printf() 验证了这一点。精度损失是由 std::cerr 输出或分配给 std::stringstream 引起的。 setprecision 成功了。非常感谢!
【解决方案2】:

没有问题。 0.00208333 和 3.12708 的有效数字都是 6。这是正确的结果。

【讨论】:

  • 在我的情况下这是一个问题,即使这可能不是不当行为。 ;)
【解决方案3】:

有时为了根据所需的精度获取值,我们必须指定精度限制,这是我的代码,它工作正常,希望对您有所帮助:

double minutes = 3;
minutes = minutes / (24.0*60.0);
double hours = 3;
hours = hours / 24.0; 
double days = 3;
double age = days + hours + minutes;
printf("%.8f",age);//here i have included the places of precision (.8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多