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

标签 c sse rounding

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

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)

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

关于c - _mm_cvt_ss2si 给出的结果与简单舍入不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31094556/

相关文章:

c - 为什么“while(!feof(file))”总是错误的?

c - 条件在选择排序中的作用?

c++ - 跨平台 SIMD 调用可能只用一个可执行文件吗?

python - 如何在 numpy 中始终对 XX.5 进行舍入

c# - 为什么将 DateTime 格式化为字符串会截断而不是舍入毫秒?

php - 获取一轮剩余时间

c - 在 C 中排序后跟踪数组的原始索引

c - 当我尝试计算学生平均成绩时,程序停止工作

c++ - AVX、SSE 总和比 gcc 自动向量化慢

d - SSE 对函数的陌生感