Probleme de cosinus

Résolu
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009 - 11 déc. 2007 à 15:42
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009 - 12 déc. 2007 à 10:34
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

titof3812 Messages postés 18 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 12 décembre 2007
12 déc. 2007 à 10:12
Ton Pb vient du fait que Pi nést pas assez precis il vaut 3.1415926535897932384626433832795
ca devrait arranger ta precision

a++
3
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009
11 déc. 2007 à 15:44
correction fait , result est un float :)
mais ca marche toujours pas
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 16:32
Es-tu sûr que 4 octets seront suffisant pour stocker un résultat flottant ?

C++ (@++)<!--
0
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009
11 déc. 2007 à 16:46
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009
11 déc. 2007 à 16:46
Marche toujours pas
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 16:51
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++ (@++)<!--
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
11 déc. 2007 à 17:26
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 17:30
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++ (@++)<!--
0
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009
12 déc. 2007 à 08:50
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.
0
Michou69004 Messages postés 16 Date d'inscription mardi 11 décembre 2007 Statut Membre Dernière intervention 17 janvier 2009
12 déc. 2007 à 10:34
Merci pour ta réponse.
Tout c'est arranger donc.
0
Rejoignez-nous