double 表現を使用して 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 へのキャストが主な原因でブロックされています。存在しません (キャストは存在しますが、ビットは移動しません。レジスタ double の「解釈」を変更するだけです) /int)。
変換を行うために、simd レジスタから通常のレジスタにデータを戻したくありません。確かにSIMDのコツはあるのですが、私は知りません。
だから助けて^_^」
一番、