• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

sse float 转int 截断和不截断

之前, 我用sse指令, 想把float 型转成int, 不过其中遇到了一些困惑,就是截断和不截断的问题, 这个问题一直困扰我好集体, 最后终于解决了, 原来sse本身就有截断和不截断的指令。

 

_mm_cvtps_epi32 是SSE2的一条指令CVTPS2DQ。在MSDN上的解释是

Converts the four single-precision, floating-point values of a to signed 32-bit integer values.

把四个float变量强转为四个int变量。其中需要注意的是他的截断规则:四舍五入,在进位后末位是偶数的进,否则不进位。

紧接着是另一个指令_mm_cvttps_epi32, Converts the four single-precision, floating-point values of a to signed 32-bit integer values using truncate。

这里就多了using truncate,意思是直接截断。与C/C++中的 r = (int)a 一样。使用它们时候要注意哦。

 

 __m128 test1 = _mm_set_ps(3.4f, 3.5f, 3.6f, 4.5f);

 __m128i test2 = _mm_cvtps_epi32(test1);

 __m128i test3 = _mm_cvttps_epi32(test1);

 

test2 结果是: 3,4,4,4;

test3 结果是: 3,3,3,4;


posted @ 2013-10-29 21:58  Class Xman  阅读(490)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3