SSE element。すなわち__m128 exp( __m128 x )
で動作する指数関数の近似を探しています。
迅速な実装ですが、精度が非常に低いようです。
static inline __m128 FastExpSse(__m128 x)
{
__m128 a = _mm_set1_ps(12102203.2f); // (1 << 23) / ln(2)
__m128i b = _mm_set1_epi32(127 * (1 << 23) - 486411);
__m128 m87 = _mm_set1_ps(-87);
// fast exponential function, x should be in [-87, 87]
__m128 mask = _mm_cmpge_ps(x, m87);
__m128i tmp = _mm_add_epi32(_mm_cvtps_epi32(_mm_mul_ps(a, x)), b);
return _mm_and_ps(_mm_castsi128_ps(tmp), mask);
}
誰かがより高速で(またはより速く)より良い精度で実装できるでしょうか?
Cスタイルで書いて頂ければ幸いです。
ありがとうございました。
これらの方程式(tanh、cosh、artanh、sinhなど)の高速バージョンの作成に関する論文があります。
http://ijeais.org/wp-content/uploads/2018/07/IJAER180702.pdf 「インテルSvml Simd組み込み関数のコンパイラー最適化インライン化実装の作成」
それらのtanh方程式6、9ページは@NicSchraudolphの回答に非常に似ています