2

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のコツはあるのですが、私は知りません。

だから助けて^_^」

一番、

4

1 に答える 1