C++舍入问题

C++ rounding issue

本文关键字:问题 舍入 C++      更新时间:2023-10-16

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

编辑:

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解决了这个问题。感谢您的帮助

这是一个浮点精度问题。一个很好的解决方法是将历史程序点设置为刚好偏离积分值,例如15 - e,其中e的阶数为10-6。

是,

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

这个博客解释了如果你想对浮点数进行四舍五入,你可能面临的所有问题(以及天真解决方案的陷阱)。它还建议以下更稳健的"添加1e-6"实现

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

您可以测试mysound(0.49999997)=0和mysoud(0.49999999)=1。

所以我会先读这个博客,然后再称这个问题完全解决!

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