我正在尝试使用双重表示来构建 2^n 。诀窍是(众所周知)
// tips to calculate 2^n using the exponent of the double IEEE representation
union ieee754{
double d;
uint32_t i[2];
};
// Converts an unsigned long long to a double
inline double uint642dp(uint64_t ll) {
ieee754 tmp;
tmp.ll=ll;
return tmp.d;
}
-----------------------------------
// e^x = 2^n e^y, n = round(x/log(2)+0.5)
double x = 4.3; // start from there
double y = round(x/log(2)+0.5)
int n = (int)y; // convert in to double
uint642dp(( ((uint64_t)n) +1023)<<52); // calculate 2^n fastly
如果 n = 4,它将返回 16。
目前我正在寻找相同的这个,但用于 SIMD 计算。考虑到 SSE2 double,在轮函数之后我会得到一个寄存器 sse2 __m128d v = (4.0, 3.0); 形成这个寄存器如何计算 2^v ...我被阻塞主要是由于将 __m128d 转换为 __m128i,它不存在(它仍然存在一个强制转换但它不移动位,只需更改寄存器双精度的“解释” /int)。
我不想将数据从 simd 寄存器返回到普通寄存器来进行转换。它肯定存在 SIMD 的提示,但我不知道。
所以帮助^_^'
最好的,