gpt4 book ai didi

c++ - cvRound() 中的 x64 舍入不一致 (_mm_cvtsd_si32)

转载 作者:太空狗 更新时间:2023-10-29 19:43:25 26 4
gpt4 key购买 nike

在使用 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 的幂。

真正发生的是“四舍五入为偶数”。这是一种消除偏差的方法,偏差会在半整数总是四舍五入时发生。

http://en.wikipedia.org/wiki/Rounding#Round_half_to_even

关于c++ - cvRound() 中的 x64 舍入不一致 (_mm_cvtsd_si32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com