Ah ouais quand même.. Je ne savais pas que des codes informatiques pouvaient être privés. Très intéressant tout ça, malgré que l'algorithme soit ouvert à tous. Je ne me servirais pas de mon programme a des fins professionnel ou publique. C'est de l'ordre d'usage privé.
Vous allez peut être me trouver un peu "chiant" ou bien "très chiant" :p, enfin bref,
Je ne suis pas très fort en mathématique (oui mathématique rime avec informatique), donc j'ai du mal a comprendre cet algorithme et de les comparer aux codes que je trouve sur internet (source Wiki : [CORDIC — Wikipédia](http://Wikipedia Cordic)) et que sur papier je peux le réaliser, mais sur clavier... Ca donne rien car je suis pauvre en code C / C++.
Mais je sais qu'au final je dois trouver un résultat qui est le cos, sin, tan avec des chiffres après la virgule exacte selon les bits que je choisis.
La formule pour laquelle je veux trouver ces valeurs exactes est la suivante :
arccos(sin(LATa)*sin(LATb) + cos (LATa)*cos(LATb)*cos(LONa-LONb))
--> Est ce qu'on peut utiliser cordic 3x pour Cos Sin et ArcCos ?
--> Est ce que si j'utilise ce code suivant ça pourrait fonctionner ? Et comment l'exploiter pour calculer mes 3 valeurs cos sin et arccos ?
Parce qu'ici ils donnent le gros morceau, mais je sais pas si c'est une library en .h ou bien un truc à insérer directement dans le programme. Et puis j'en fais quoi en fait une fois inséré dans le Arduino ? Comment faire pour qu'ils lisent et convertissent mes valeurs ?
Merci encore une fois a vous pour vous pencher sur mon problème et les explications
URL d'origine : Fastest way to do sin(), cos() atan2() - #34 by MarkT - Programming Questions - Arduino Forum
MarkT:
CORDIC no not mentioned before, might be interesting to see the timing of those on Arduino....
430us for a 27bit resolution version...
long cordic_lookup [] =
{
0x20000000L,
0x12E4051EL,
0x09FB385BL,
0x051111D4L,
0x028B0D43L,
0x0145D7E1L,
0x00A2F61EL,
0x00517C55L,
0x0028BE53L,
0x00145F2FL,
0x000A2F98L,
0x000517CCL,
0x00028BE6L,
0x000145F3L,
0x0000A2FAL,
0x0000517DL,
0x000028BEL,
0x0000145FL,
0x00000A30L,
0x00000518L,
0x0000028CL,
0x00000146L,
0x000000A3L,
0x00000051L,
0x00000029L,
0x00000014L,
0x0000000AL,
0x00000005L
};
#define ITERS 10000
void setup ()
{
Serial.begin (57600) ;
long elapsed = micros () ;
for (long i = 0 ; i < ITERS ; i++)
test_cordic (i << 16, false) ;
elapsed = micros () - elapsed ;
Serial.print ("time taken for ") ; Serial.print (ITERS) ;
Serial.print (" iterations = ") ; Serial.print (elapsed) ; Serial.println ("us") ;
Serial.print (elapsed / ITERS) ; Serial.println (" us/iter") ;
test_cordic (0x15555555L, true) ;
test_cordic (0x95555555L, true) ;
}
void test_cordic (long aa, boolean printres)
{
long xx = 607252935L ;
long yy = 0L ;
if ((aa ^ (aa<<1)) < 0L)
{
aa += 0x80000000L ;
xx = -xx ;
yy = -yy ;
}
for (int i = 0 ; i <= 27 ; i++)
{
long da = cordic_lookup [i] ;
long dx = yy >> i ;
long dy = -xx >> i ;
if (aa < 0L)
{
aa += da ;
xx += dx ;
yy += dy ;
}
else
{
aa -= da ;
xx -= dx ;
yy -= dy ;
}
}
if (!printres)
return ;
Serial.print ("end angle=") ; Serial.print (aa) ;
Serial.print (" end x = 0.") ; Serial.print (xx) ;
Serial.print (" end y = 0.") ; Serial.println (yy) ;
}
void loop ()
{
}