2009-12-19 7 views

답변

3

Carl Smotricz는 his answer으로 지적 했으므로 간단한 C 프로그램을 작성하여 하드 코딩 된 배열을 쉽게 작성할 수 있습니다.

int main(int argc, char * argv[]) 
{ 
    const int tableSize = 10; 
    const char * fileName = "sin_table.txt"; 

    int x; 
    FILE * file; 

    file = fopen(fileName, "w"); 
    if (file == NULL) { printf("unable to open file\n"); return -1; } 

    fprintf(file, "float sin_table[%d] =\n{\n ", tableSize); 
    for (x = 0; x < tableSize; x++) 
    { 
     fprintf(file, "\t%f,\n", sinf(x*2*pi/tableSize)); 
    } 
    fprintf(file, "};\n"); 

    fclose(file); 
    return 0; 
} 

을 그리고 출력은 다음과 같이 보일 것이다 :

다음 코드는 트릭을 할 것

float sin_table[10] = 
{ 
    0.000000, 
    0.587785, 
    0.951057, 
    0.951056, 
    0.587785, 
    -0.000000, 
    -0.587785, 
    -0.951057, 
    -0.951056, 
    -0.587785, 
}; 
+0

답변 해 주셔서 감사합니다. 매우 도움이됩니다. –

2

런타임 오버 헤드를 원하지 않으면 모든 값을 C 배열 선언/초기화로 인쇄 한 작은 프로그램을 작성한 다음 해당 파일을 프로그램에 #include으로 인쇄하십시오.

3

당신은 (이미 제안) 매우 빠른 테이블을 사용하는 일을합니다.

또 다른 접근법은 사인 - 오실레이터를 시뮬레이트하고 데이터 어레이를 생성하는 데 사용하는 것입니다. 여기

이 작업을 수행하는 방법을 예입니다

int main (int argc, char **args) 
{ 
    int i; 

    float data[1024]; 
    float angle = 2.0f * 3.14/1024; 

    // start of the sine-wave: 
    float sinval = 0; 
    float cosval = 1; 

    // rotation per iteration 
    float delta_sin = sinf(angle); 
    float delta_cos = cosf(angle); 

    for (i=0; i<1024; i++) 
    { 
    // store current value: 
    data[i] = sinval; 

    // update the oscillator: 
    float s = sinval * delta_cos - cosval * delta_sin; 
    float c = sinval * delta_sin + cosval * delta_cos; 
    sinval = s; 
    cosval = c; 
    } 
} 

이 뒤에 트릭은 우리가 9sinval, cosval에 저장된 2D 공간에서 고정 점)로 시작하는 것이있다. 또한 (delta_cos, delta_sin)에서 한 회전에 대한 매개 변수를 미리 계산합니다.

나는 루프에서 고정 회전으로 점을 1024 번 회전시키는 것입니다. 이것은 반복마다 sin/cos 쌍을 만듭니다. (참고 : 복소 곱셈과 동일합니다).

이 방법은 조만간 불안정 해지고 루프에서 sin/cos를 호출하는 것과 같지 않습니다.

거대한 테이블을 만드는 것은 좋은 생각이 아니지만, 약간의 오류와 작은 테이블을 가지고 최대 10,000 개의 요소까지 살 수 있다면 매우 유용합니다. 이 문제를 해결하려면 유형을 두 배로 변경하고 적절한 반올림을 수행하거나 n 회 반복 할 때마다 결과를 다시 정규화하십시오.


편집 : 코드를 double 및 1e9 반복 테스트했습니다. 나를 위해 일합니다. 단계에서 약간의 드리프트가 있지만 결과는 단 정밀도 sinf/cosf보다 훨씬 정확합니다.

+0

답변과 그에 대한 귀하의 철저한 설명에 감사드립니다. 고맙습니다! –

관련 문제