有些时候,我使用这样的代码有效地提取双精度的位模式作为int64:
inline
int64 rawDouble(double aDouble)
{
union Union {
Union(double aDouble) : fDouble(aDouble) {}
int64 bits() { return fInt64; }
double fDouble;
int64 fInt64;
};
return Union(aDouble).bits();
}
(显然,有一种完全类似的模式可以将单个位模式提取为int32。)
我喜欢这个技巧,因为x86的SEE指令(和其他指令集类似)允许在逐个指令的基础上将各个寄存器位置解释为整数或浮点。
有人向我指出,C ++ 11及更高版本认为这是UB。
如果我不能使用这个技巧,我可以采用C ++批准的方法吗?