如何截断 XMM 寄存器中的浮点值
How to truncate float values in XMM register
如何只获取float的整数部分?所以,我有一个浮点数组: x[4] = {5.0, 13.0, 25.0, 41.0};我把它放在 xmm0 中,然后用它做 sqrt。我还需要一个命令来帮助仅获取此 sqrt 的一部分。例如 5 的 sqrt 将是 2.236068,我只需要 2.0 的答案
代码:
__asm
{
movups xmm0, x
sqrtps xmm0, xmm0
//here need some command
movups x, xmm0
}
有一个 SO question 的一些答案涉及主题:
- fmodf (fp modulo) function;
- float to int(也提到内在函数,见下文);
还有一个paper讨论了float转int的问题,特别提到了第二个答案(没有抄袭)。
主要的 Windows 编译器(至少)带有可能感兴趣的所谓内在函数(高度优化的内联函数),例如。 MSVC and Intel (float to int: p. 42; float floor(float)
function and likes: p. 135).
警告
这是经过研究的答案。我没有亲自使用参考技术。
使用roundps
是最简单的。舍入模式 table 在其他地方,但您需要舍入模式 3(接近零)。
仅当输入保证在某个范围内(大约 0 到 4.6e18,因为平方根)时,转换为整数并返回才有效。您可以使用 cvttps2dq
和 cvtdq2ps
来完成此操作。那将只需要 SSE2,roundps
需要 SSE4.1。仅当舍入模式设置为截断时才可以使用 cvtps2dq
,而通常情况下并非如此,因此您必须更改并恢复它。
如何只获取float的整数部分?所以,我有一个浮点数组: x[4] = {5.0, 13.0, 25.0, 41.0};我把它放在 xmm0 中,然后用它做 sqrt。我还需要一个命令来帮助仅获取此 sqrt 的一部分。例如 5 的 sqrt 将是 2.236068,我只需要 2.0 的答案
代码:
__asm
{
movups xmm0, x
sqrtps xmm0, xmm0
//here need some command
movups x, xmm0
}
有一个 SO question 的一些答案涉及主题:
- fmodf (fp modulo) function;
- float to int(也提到内在函数,见下文);
还有一个paper讨论了float转int的问题,特别提到了第二个答案(没有抄袭)。
主要的 Windows 编译器(至少)带有可能感兴趣的所谓内在函数(高度优化的内联函数),例如。 MSVC and Intel (float to int: p. 42; float floor(float)
function and likes: p. 135).
警告
这是经过研究的答案。我没有亲自使用参考技术。
使用roundps
是最简单的。舍入模式 table 在其他地方,但您需要舍入模式 3(接近零)。
仅当输入保证在某个范围内(大约 0 到 4.6e18,因为平方根)时,转换为整数并返回才有效。您可以使用 cvttps2dq
和 cvtdq2ps
来完成此操作。那将只需要 SSE2,roundps
需要 SSE4.1。仅当舍入模式设置为截断时才可以使用 cvtps2dq
,而通常情况下并非如此,因此您必须更改并恢复它。