このコードから三角関数表がどうして作られるのかわかりません
このコードから三角関数表がどうして作られるのかわかりません。
実行すると確かに三角関数表なのですが、奇っ怪な方法の理由はわかります。
sinを一度しか呼ばないという制限のためです。
けれど、その後どうしてこんな方法でと思ったので質問します。
static void make_sintbl(int n, float sintbl[])
{
int i, n2, n4, n8;
double c, s, dc, ds, t;
n2 = n / 2; n4 = n / 4; n8 = n / 8;
t = sin(PI / n);
dc = 2 * t * t; ds = sqrt(dc * (2 - dc));
t = 2 * dc; c = sintbl[n4] = 1; s = sintbl[0] = 0;
for (i = 1; i < n8; i++) {
c -= dc; dc += t * c;
s += ds; ds -= t * s;
sintbl[i] = (float)s;
sintbl[n4 - i] = (float)c;
}
if (n8 != 0) sintbl[n8] = (float)sqrt(0.5);
for (i = 0; i < n4; i++)
sintbl[n2 - i] = sintbl[i];
for (i = 0; i < n2 + n4; i++)
sintbl[i + n2] = - sintbl[i];
}
C言語による最新アルゴリズム辞典:奥村晴彦著:技術評論社より
※ 同書の該当部分に「標本点の数 n は2の整数乗に限る」との記載あり