_mm_cvt_ss2si 给出与简单舍入不同的结果

_mm_cvt_ss2si gives different results than simple rounding

在下面的代码中,方法 A 与方法 B 不同。谁能解释一下 为什么 _mm_cvt_ss2si 小数部分恰好为 0.5 时四舍五入为偶数?

float f;

// rounding method  A
_mm_cvt_ss2si(_mm_load_ss(&f));

// rounding method B
(long)((f>0.0f) ? (f + 0.5f):(f -0.5f));

查看评论以获取问题的答案。

如果你想在一种情况下使用特定的舍入模式,而不改变MXCSR,你可以使用SSE4.1 ROUNDPD / ROUNDPS。 (这不进行整数转换,只是将 FP 值四舍五入为整数。)

__m128d _mm_round_pd (__m128d a, int rounding)

请参阅手册了解哪些标志可以作为 rounding 参数传递。