Probleme de cosinus [Résolu]

Signaler
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009
-
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009
-
Bonjour a tous.
J'ai un petit probleme avec mon code.
pour effectuer une rotation , j'utilise ma fonction my_rota et je suppose qu'il y a un probleme car elle me retourne un calcul faux.
Voyez vous ou est mon erreur?

char *my_rota(int nb, int ang)
{
int result;
float ang2;
char *ch;

ch = malloc(sizeof(4));
ang2 = 3.14*(float)ang/180;
result = (cos(ang2) - sin(ang2)) * (float)nb;
sprintf(ch, "%f", result);
return(ch);
}

10 réponses

Messages postés
18
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
12 décembre 2007

Ton Pb vient du fait que Pi nést pas assez precis il vaut 3.1415926535897932384626433832795
ca devrait arranger ta precision

a++
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009

correction fait , result est un float :)
mais ca marche toujours pas
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Es-tu sûr que 4 octets seront suffisant pour stocker un résultat flottant ?

C++ (@++)<!--
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009

char *my_rota(int nb, int ang)
{
float result;
float ang2;
char ch[20];

ang2 = 3.14*(float)ang/180;
result = (cos(ang2) - sin(ang2)) * (float)nb;
sprintf(ch, "%f", result);
return(ch);
}

Modification effectuer
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009

Marche toujours pas
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ben non. On ne retourne pas de variable locale.



char *my_rota(int nb, int ang, char *ch)

{

  float result;

  float ang2;

  ang2 = 3.14*(float)ang/180;

  result = (cos(ang2) - sin(ang2)) * (float)nb;

  sprintf(ch, "%f", result);

  return ch;

}

Comme ça, tu allous ta mémoire en dehors de la fonction.
Tu peux ainsi faire:
char tmp[30];
printf("%s\n", my_rota(5, 10, tmp));

C++ (@++)<!--
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Tu peux aussi retourner la valeur en float plutot que sous forme de chaine de caractères.
Au besoin tu la converti en dehors de ta fonction, mais j'imagine que tu vas avoir besoin de la valeur retournée, et il va donc falloir que tu reconvertisses ta chaine de caractere en flottant, pas l'idéal!.

AGILiCOMSavon
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
float my_rota(int nb, int ang, char *ch)
{
  float result;
  float ang2;

  ang2 = 3.14f*(float)ang/180;
  result = (cos(ang2) - sin(ang2)) * (float)nb;
  sprintf(ch, "%f", result);
  return result;
}

Voilà, devrait aller maintenant. Si tes résultats son toujours inexacte, c'est peut-être ton calcule qui n'est pas bon.

C++ (@++)<!--
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009

bon voila ce que j'ai fait mais le probleme est toujours le meme :)

float my_rota(int nb, int ang)
{
float result;
float ang2;

ang2 = 3.14*(float)ang/180;
result = (cos(ang2) - sin(ang2)) * (float)nb;
return(result);
}

et dans mon main , je fais
printf("%f", (my_rota(1, 360));

Logiquemeent , il devrai m'afficher 1. mais il m'affiche un nombre (1,0008 et des poussieres )un peu trop long , c'est pourquoi je vous demande pourquoi?
Donc je me suis dit qu'il faudrait faire un petit if pour la précision.
Messages postés
16
Date d'inscription
mardi 11 décembre 2007
Statut
Membre
Dernière intervention
17 janvier 2009

Merci pour ta réponse.
Tout c'est arranger donc.