C++舍入问题
C++ rounding issue
我正在尝试使用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)。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- 类型转换<int>的舍入问题
- 使用设置精度在C++中舍入小数点时出现问题
- 货币数据的Visual C++舍入问题
- 如何优雅地解决这个舍入问题
- 将浮点转换为无符号短整型时出现舍入问题
- c++双舍入问题
- C++舍入问题