私は、OpenCL で高速なバイナリ累乗の実装を設計しようとしています。私の現在の実装は、この本の pi に関するものと非常によく似ています。
// Returns 16^n mod ak
inline double expm (long n, double ak)
{
double r = 16.0;
long nt;
if (ak == 1) return 0.;
if (n == 0) return 1;
if (n == 1) return fmod(16.0, ak);
for (nt=1; nt <= n; nt <<=1);
nt >>= 2;
do
{
r = fmod(r*r, ak);
if ((n & nt) != 0)
r = fmod(16.0*r, ak);
nt >>= 1;
} while (nt != 0);
return r;
}
改善の余地はありますか?現在、私のプログラムは大部分の時間をこの関数に費やしています。