作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在使用 MSVC2013 的 x64 Windows 上,我正在使用 OpenCV 的 cvRound
函数,目的是从 x.5
值进行舍入。我遇到了一个不一致的地方,cvRound(17.5f)
返回 18
(很好!),但是 cvRound(20.5f)
返回 20
而不是预期的 21
cvRound 就是这样实现的,所以它似乎是 Microsoft 在 _mm_cvtsd_si32()
中的不一致。
int cvRound( double value )
{
__m128d t = _mm_set_sd( value );
return _mm_cvtsd_si32(t);
}
谁能建议这是怎么回事/为什么会这样?
FWIW,cvRound(20.5f + 1e-3f)
返回 21
。
最佳答案
小的半整数可以用二进制 float 精确表示——0.5 是 2 的幂。
真正发生的是“四舍五入为偶数”。这是一种消除偏差的方法,偏差会在半整数总是四舍五入时发生。
关于c++ - cvRound() 中的 x64 舍入不一致 (_mm_cvtsd_si32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989989/
我是一名优秀的程序员,十分优秀!