【发布时间】:2011-07-09 23:00:32
【问题描述】:
在 C 中翻转双精度(或浮点)符号的最快方法是什么?
我认为直接访问符号位是最快的方法,发现如下:
double a = 5.0;
*(__int64*)&a |= 0x8000000000000000;
// a = -5.0
float b = 3.0;
*(int*)&b |= 0x80000000;
// b = -3.0
但是,以上不适用于负数:
double a = -5.0;
*(__int64*)&a |= 0x8000000000000000;
// a = -5.0
【问题讨论】:
-
该代码完全不可移植。您不仅调用了各种平台相关的 float 实现,还使您的代码依赖于字节序。
-
它也可能会破坏寄存器存储浮点数的性能 - 它需要移动到整数寄存器,执行操作,然后移回 FP (x87/SSE)注册。
-
我很想知道什么计算有浮点否定作为它的性能瓶颈
-
@Yann Ramin:GCC 将“-a”优化为“XORPS %XMM1, %XMM0”(GNU 语法),XMM1 在 x86_64 上持有否定位掩码,在 x86_32 上使用 FCHS。
-
你的代码也严重违反了别名规则,这意味着它在现代编译器上不会做你想做的事情。
标签: c floating-point double bit-manipulation sign