0

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

编辑:

int minRange = 14;
double val;


val = minRange + j*0.05;


gsl_histogram_increment(hist, val);

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

我通过将 1e-6 添加到 val 解决了这个问题。感谢您的帮助

4

2 回答 2

3

这是一个浮点精度问题。解决问题的一个好方法是设置直方图点,使其刚好离开整数值,例如10-615 - ee顺序。

于 2013-06-25T12:19:36.770 回答
0

是的,

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

这个博客解释了如果你想对浮点数进行四舍五入会遇到的所有问题(以及幼稚解决方案的陷阱)。它还建议以下更健壮的“添加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 健壮(您需要适应双精度)。

于 2013-08-23T22:31:34.910 回答