有没有一种快速的方法可以将双精度值转换为短裤(16 位有符号),目前我正在做这样的事情:
double dval = <sum junk>
int16_t sval;
if (val > int16_max) {
sval = int16_max;
} else if (val < int16_min) {
sval = int16_min;
} else
sval = (int16_t)val;
我怀疑有一种使用 SSE 的快速方法可以显着提高效率。
查找 minsd、maxsd 和 cvtsd2si,或者如果您想并行执行 2,则使用 minpd、maxpd 和 cvtpd2dq。
使用第一种方法的唯一真正好处是您可以保存分支。无论如何,使用编译为 SSE2 的代码生成的 SSE2 代码几乎可以达到两倍的速度……真正的胜利来自一次执行其中 2 个。
编辑:如果您想使用 Visual Studio 内部函数来执行此操作,那么我相信代码将如下所示:
__m128d sseDbl = _mm_set_sd( dbl );
sseDbl = _mm_min_sd( dbl, _mm_set_sd( 32767.0 ) );
sseDbl = _mm_max_sd( dbl, _mm_set_sd( -32768.0 ) );
short shrtVal = (short)_mm_cvtsd_si32( sseDbl );
并完成了工作。使用汇编程序也非常相似,但上述内容肯定会给您带来更好的 Visual Studio 性能。