C ++舍入问题

时间:2013-06-25 12:16:20

标签: c++ histogram gsl

我正在尝试使用GSL创建直方图。当我尝试将直方图1470/100的值添加到直方图时,我遇到了问题。 这导致14.69999999,并且当添加到直方图时,它被舍入到较低的箱。 我的问题是如何在14.7而不是14.69999中制作1470/100结果? 谢谢

编辑:

int minRange = 14;
double val;


val = minRange + j*0.05;


gsl_histogram_increment(hist, val);

当将val添加到直方图时,它被认为是14.65而不是14.7。 (在这种情况下j为14)。

我通过向val添加1e-6解决了这个问题。谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

这是一个浮点精度问题。一种很好的解决方法是将组织图点设置在整数值之外,例如: 15 - e其中e的顺序为10-6。

答案 1 :(得分:0)

是的,

添加1e-6通常有效,但通常在截断浮动时必须更加小心。

This blog解释如果你想要对浮数进行舍入(以及天真解决方案的陷阱)可能遇到的所有问题。它还建议以下更强大的实施“添加1e-6”

 float myround(float f)
 {
      if (f >= 0x1.0p23) return f;
      return (float) (unsigned int) (f + 0.49999997f);
 }

您可以测试myround(0.49999997)= 0和myround(0.49999999)= 1.

因此,在完全解决此问题之前,我会先阅读此博客!

另一点是c ++ 11有一个名为std :: round的新函数,它返回最接近的整数,因此你也可以通过比较std::abs(x - std::round(x)) < epsilon来实现舍入,其中epsilon是你的目标。同样,这是一个天真的实现,不像myround那样健壮(你需要适应双倍)。