मैं एक पाप क्योंकि बनाना चाहते हैं अप, अनुकूलन के लिए टेबल देखने के लिए 0 से UCHAR_MAX
को एक सरणी सूचकांक का उपयोग करके ताकि 0 रेडियन सूचकांक 0 है, pi/2
रेडियन UCHAR_MAX/4
है:रेडियन बड़ा होने पर यह पाप क्यों गलत दिखता है?
sincos.h
#include <limits.h>
#include <math.h>
int sini[UCHAR_MAX];
int cosi[UCHAR_MAX];
#define MAGNIFICATION 256
#define SIN(i) sini[i]/MAGNIFICATION
#define COS(i) cosi[i]/MAGNIFICATION
void initTable(){
for(int i=0;i<UCHAR_MAX;i++){
sini[i]=sinf(i*2*M_PI/UCHAR_MAX)*MAGNIFICATION;
cosi[i]=cosf(i*2*M_PI/UCHAR_MAX)*MAGNIFICATION;
}
}
UCHAR_MAX
का उपयोग कर के रूप में अधिकतम मैं रेडियन thats 0 से करने के लिए 2*pi
केवल भिन्न होता है simulates को अहस्ताक्षरित चार अतिप्रवाह का अच्छा इस्तेमाल करना चाहते हैं के कारण: उदाहरण के लिए, अगर रेडियन का मूल्य 2*pi
है, सरणी के सूचकांक UCHAR_MAX
हो जाता है , क्योंकि यह अतिप्रवाह है, यह स्वचालित है ly 0 हो जाता है और कोई मॉड आवश्यक नहीं है (यदि मैं 0 से 360 डोमेन के रूप में उपयोग करता हूं तो मुझे हर बार index%360
की गणना करने की आवश्यकता हो सकती है)। जैसे निम्नलिखित
float rad[]={2.0f,4.0f,6.0f,8.0f,10.0f,-2.0f,-4.0f,-6.0f,-8.0f,-10.0f};
: तो मैं कुछ रेडियन मूल्यों के साथ यह परीक्षण
#include "sincos.h"
#include <stdio.h>
int main(){
initTable();
unsigned char radToIndex;
float rad[]={2.0f,4.0f,6.0f,8.0f,10.0f,-2.0f,-4.0f,-6.0f,-8.0f,-10.0f};
int scalar=123;
printf("scalar=%d\n",scalar);
for(int i=0;i<sizeof(rad)/sizeof(float);i++){
radToIndex=rad[i]*UCHAR_MAX/2/M_PI;
printf("%d*sin(%f) : %f , %d\n",scalar,rad[i],scalar*sinf(rad[i]),scalar*SIN(radToIndex));
}
return 0;
}
मैं 123*sin(radian)
साथ तालिका का परीक्षण, परिणाम मिले शुरू होता है वास्तविक एक से परे जाना जब रेडियन बढ़ जाती है की भयावहता (
scalar=123
123*sin(2.000000) : 111.843582 , 111
123*sin(4.000000) : -93.086708 , -92
123*sin(6.000000) : -34.368107 , -35
123*sin(8.000000) : 121.691063 , 122
123*sin(10.000000) : -66.914597 , -61
123*sin(-2.000000) : -111.843582 , -112
123*sin(-4.000000) : 93.086708 , 90
123*sin(-6.000000) : 34.368107 , 38
123*sin(-8.000000) : -121.691063 , -122
123*sin(-10.000000) : 66.914597 , 59
और एक अन्य डेटा के साथ परीक्षण:
जब रेडियन 10 या -10) हैfloat rad[]={0.01f,0.1f,1.0f,10.0f,100.0f,1000.0f,-0.01f,-0.1f,-1.0f,-10.0f,-100.0f,-1000.0f};
उत्पादन:
scalar=123
123*sin(0.010000) : 1.229980 , 0
123*sin(0.100000) : 12.279510 , 12
123*sin(1.000000) : 103.500931 , 102
123*sin(10.000000) : -66.914597 , -61
123*sin(100.000000) : -62.282974 , -97
123*sin(1000.000000) : 101.706184 , -25
123*sin(-0.010000) : -1.229980 , 0
123*sin(-0.100000) : -12.279510 , -8
123*sin(-1.000000) : -103.500931 , -100
123*sin(-10.000000) : 66.914597 , 59
123*sin(-100.000000) : 62.282974 , 98
123*sin(-1000.000000) : -101.706184 , 22
त्रुटि वृद्धि जब परिमाण बढ़ जाती है, इसलिए मैं काफी यकीन है कि तालिका गलत हो जाता है जब रेडियन बड़ी है कर रहा हूँ। sincos.h में सटीकता को नियंत्रित करने के एक मूल्य आवर्धन है, मैं इसे 256 से 4096 करने के लिए बदल गया है, लेकिन यह कोई बहुत सुधार लगता है:
scalar=123
123*sin(0.010000) : 1.229980 , 0
123*sin(0.100000) : 12.279510 , 12
123*sin(1.000000) : 103.500931 , 102
123*sin(10.000000) : -66.914597 , -62
123*sin(100.000000) : -62.282974 , -97
123*sin(1000.000000) : 101.706184 , -25
123*sin(-0.010000) : -1.229980 , 0
123*sin(-0.100000) : -12.279510 , -9
123*sin(-1.000000) : -103.500931 , -100
123*sin(-10.000000) : 66.914597 , 59
123*sin(-100.000000) : 62.282974 , 99
123*sin(-1000.000000) : -101.706184 , 22
क्यों कि होगा? क्या टेबल की तार्किक त्रुटि है?
आप सटीकता कैसे messure के लिए? – Zich