|
十分注意して作成していますが, ご自身の責任の下で使用して下さい! |
|---|
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "sincos_table.h"
int SinCos_num=-1;
double *SinCos_table=NULL;
/* SinCos_init: 90度分の cos() テーブルを作成する */
void SinCos_init(int num)
{
int i;
SinCos_table=malloc(sizeof(double)*num);
SinCos_num=num;
for (i=0; i<num; i++) SinCos_table[i]=cos(i*M_PI/2/num);
}
|
/* Cos() 関数 */
double Cos(double x)
{
double sign=1;
int i;
if (x<0) x=-x; /* cos(x)=cos(-x) */
x/=M_PI;
x=(x-(int)(x/2)*2); /* cos(x)=cos(x+2*PI) */
if (x>1) x=2-x; /* cos(x)=cos(x-PI) */
if (x>.5) {x=1-x; sign=-1;} /* -cos(x)=cos(PI-x) */
i=(int)(x*2*SinCos_num);
return (sign*SinCos_table[i]);
}
|
/* Sin() 関数: sin(x)=cos(x-M_PI/2) */ #define Sin(x) (Cos(x-M_PI/2)) |
| gcc -O3 -c sincos_table.c |
また眼目の処理速度については15億回の関数呼び出しについて手元のコンピュー タでは
| 関数 | 時間(s) |
|---|---|
| cos() | 30 |
| Cos() | 1 |
| gcc -O3 -DSINCOS_TABLE_TEST -o sincos_table sincos_table.c -lm |