按位运算对浮点有用

时间:2015-03-22 14:27:41

标签: assembly x86 floating-point bit-manipulation bitwise-operators

我注意到浮点数存在SSE指令让我感到疑惑。您可以使用fp / integer union中的标量执行相同的操作。

这个想法让我感到震惊的是,如果你对一个浮点数组件进行按位或运算,你可以通过查看结果的符号位来确定它们中的任何一个是否为负值。

浮点值的按位运算还有什么其他用途?

2 个答案:

答案 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,然后向后移动。