2016-07-24 27 views
-1

exp_ps()の実装をhttp://gruntthepeon.free.fr/ssemath/sse_mathfun.hまたはexp256_ps()からhttp://software-lisc.fbk.eu/avx_mathfun/avx_mathfun.hまで理解しようとしています。
定数cephes_exp_C2がどのように決定されるかを除いて、計算のほとんどすべてを理解しています。計算の精度が向上すると思われます。計算から除外された場合、結果として得られる関数は、はるかに速く、精度はわずかです(相対誤差は+/- 10前後の値に対して1%以下です)。そのような係数は他の数値ライブラリーでも見つかりましたが、詳しい説明はありません。exp()関数の数値計算における一義義者

+3

コードから?試み?例? –

+0

この定数は 'exp(C2)'です。ここで 'C2'は他の定数です。あなたは本当に他のすべてを理解していますか?例えば。 'cephes_exp_p0'とは何ですか? – user463035818

+2

あなたは[mcve]を表示していないだけでなく、2つのリンクを1つのテキストにダンプするだけでなく、**特定の**質問もありません。それはどのように動作するのではありません。 3年後、あなたは本当に知っているべきです! – Olaf

答えて

2

Cephesソースから検索すると、Pommierの翻訳に誤りがあると思います。 Pommierのコードでエラーが発生したのは初めてです。 Gromacsに数学ライブラリを使用することをおすすめします。

Cepheの中 exp.cから

static double C1 = 6.93145751953125E-1; 
static double C2 = 1.42860682030941723212E-6; 
.... 
px = floor(LOG2E * x + 0.5); 
n = px; 
x -= px * C1; 
x -= px * C2; 

Pommier、

_PS_CONST(cephes_exp_C1, 0.693359375); 
_PS_CONST(cephes_exp_C2, -2.12194440e-4); <-- Wrong value 
.... 

// 
// fx = LOG2E * x + 0.5 
// 
fx = _mm_mul_ps(x, *(v4sf*)_ps_cephes_LOG2EF); 
fx = _mm_add_ps(fx, *(v4sf*)_ps_0p5); 

// 
// fx = floor(fx) 
// 
emm0 = _mm_cvttps_epi32(fx); 
tmp = _mm_cvtepi32_ps(emm0); 
v4sf mask = _mm_cmpgt_ps(tmp, fx);  
mask = _mm_and_ps(mask, one); 
fx = _mm_sub_ps(tmp, mask); 

// 
// x -= fx * C1; 
// x -= fx * C2; (Using z allows for better ILP in this step) 
// 
tmp = _mm_mul_ps(fx, *(v4sf*)_ps_cephes_exp_C1); 
v4sf z = _mm_mul_ps(fx, *(v4sf*)_ps_cephes_exp_C2); 
x = _mm_sub_ps(x, tmp); 
x = _mm_sub_ps(x, z); 
+0

cephesライブラリへのリンクをありがとう、それは基本的な数学関数の実装の研究のためにはるかに良いです。しかし、私はまだC2が良いのか分かりません。 e^xは次のように変換される。e^x = e^g^n = e^ge ^(nloge(2))= e ^(g + nloge(2))=> x = g + )。 nはfloor/round関数で計算され、x - = px * C1はg = x - n loge(2)(C1 == loge(2))と等価です。 x - = px * C2で計算されるものは?それは何とか精度を高めるために浮動小数点数に関連していますか? – faramir

関連する問題