_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
参数传递。
在下面的代码中,方法 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
参数传递。