我注意到浮点数存在SSE指令让我感到疑惑。您可以使用fp / integer union中的标量执行相同的操作。
这个想法让我感到震惊的是,如果你对一个浮点数组件进行按位或运算,你可以通过查看结果的符号位来确定它们中的任何一个是否为负值。
浮点值的按位运算还有什么其他用途?
答案 0 :(得分:6)
很多。例如,当你只需要对像AVX这样的浮点指令集进行按位运算时,那些就变得非常方便了。
另一个应用:制作常量。你可以在Agner Fog's optimization guide for x86 platforms的表13.10和13.11中看到很多例子。一些例子:
pcmpeqd xmm0, xmm0
psrld xmm0, 30 ; 3 (32-bit)
pcmpeqd xmm0, xmm0 ; -1
pcmpeqw xmm0, xmm0 ; 1.5f
pslld xmm0, 24
psrld xmm0, 2
pcmpeqw xmm0, xmm0 ; -2.0f
pslld xmm0, 30
您也可以使用它来检查浮点值是否为2的幂。
其他一些应用程序如Harold所说:取绝对值和减去绝对值,复制符号,复用......我将在单个数据中演示以便于理解
// Absolute:
abs = x & ~(1U << 31);
// Muxing
v = (x & mask) | (y & ~mask); // v = mask ? x : y; with mask = 0 or -1
// Copy sign
y = (y & ~(1U << 31)) | (x & (1U << 31));
答案 1 :(得分:3)
它可以用于使用所谓的"double double" arithmetic扩展浮点精度,特别是当您无法访问融合乘法加法(FMA)指令时。
如果你有两个浮点数,其中有效数字的后半部分为零,那么它们的乘积是准确的。因此,一个常见的技巧是将浮点数的一部分归零,从原始数字中减去该数字,并且您有两个数字与原始值相加,但每个数字仅使用有效数字的一半。通过适当地安排操作顺序,您可以得到两个与实际产品相加的浮点数:例如,参见Dekker (1971)。
我使用Julia进行了一些粗略的速度测试here:浮点数比移位到整数寄存器至少快50%,使用整数AND,然后向后移动。