我正在尝试使用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解决了这个问题。谢谢你的帮助
答案 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那样健壮(你需要适应双倍)。