[c]pourquoi pow ((double)2,(double)3) renvoi 0 et non pas 8 ?

pourquoi pow ((double)2,(double)3) renvoi 0 et non pas 8 ? [c] - C - Programmation

Marsh Posté le 31-05-2004 à 18:05:03    

j'ai fais quelques petit tests dans un tout petit prog, mais j'arrive pas à faire un simple : 2 puissance 3  
 
 

Code :
  1. #define _GNU_SOURCE
  2. #include <math.h>
  3. #include <stdio.h>
  4. main ()
  5. {
  6.         double resultat;
  7.         printf("\ncouccou\n" );
  8.         resultat = pow ((double)2.,(double)3);
  9.         printf("\ resultat = lf",resultat);
  10.         printf("\nFIN\n\n" );
  11. }


 
et quand j'execute :

Code :
  1. [weed@localhost amusant]$ ./-tpow
  2. couccou
  3. resultat = 0
  4. FIN


 
comme indiqué dans l'aide ci-dessous :
  - je pense avoir bien casté pour respecter le prototype  : double pow (double, double)  
  -j'ai indiqué comme entete :
  #define _GNU_SOURCE
  #include <math.h>
 

Citation :

NOM
       pow, powf, powl - Fonction puissance
 
SYNOPSIS
       #define _GNU_SOURCE
       #include <math.h>
 
       double pow (double x, double y);
 
       float powf (float x, float y);
 
       long double powl (long double x, long double y);
 
DESCRIPTION
       La fonction pow() renvoie la valeur de x élevé à la puissance y.
 
ERREURS
       EDOM   L'argument  x  est  négatif,  et y n'est pas entier. Le résultat
              serait un nombre complexe.
 
NOTES
       Pour utiliser les fonctions de la bibliothèque mathématique, il ne faut
       pas  oublier d'ajouter l'argument -lm sur la ligne de commande de cc(1)
       ou ld(1), lors de l'édition des liens.
 
CONFORMITÉ
       SVID 3, POSIX, BSD 4.3, ISO 9899 Les variantes  float  et  long  double
       sont des demandes C99.


   
  - j'ai bien precisé l'option -lm en compilant  

Code :
  1. [weed@localhost amusant]$ gcc tpow.c -o -tpow -lm
  2. tpow.c:11:16: warning: unknown escape sequence: '\040'


 

Citation :

14.17 Pourquoi j'ai des erreurs sur les fonctions de la bibliothèque, alors que j'ai bien inclus les entêtes ?
 Les en-têtes (les .h) ne contiennent que les prototypes des fonctions. Le code proprement-dit de ces fonctions se trouve dans des fichiers objets. Ce code doit être « lié » au tien. Cela est fait par un éditeur de liens.  
 
Pour certaines fonctions, il faut spécifier explicitement à l'éditeur de liens où il peut les trouver (et ce particulièrement pour les fonctions non-standard).  
Par exemple, sous Unix, pour utiliser les fonctions mathématiques, il faut généralement lier le programme avec la bibliothèque adéquate :  
    cc -lm monfic.o -o monprog
   


par contre j'ai peut etre pas bien specifier la fonction mathematique avec l'option -lm


Message édité par weed le 31-05-2004 à 18:28:38
Reply

Marsh Posté le 31-05-2004 à 18:05:03   

Reply

Marsh Posté le 31-05-2004 à 18:08:38    

man printf maintenant
 
(double)2.,(double)3
 
-> 2., 3. ou 2.0, 3.0 sont des double
-> pour les float, tu rajoute un f en suffix 2.0f, 3.0f


Message édité par Taz le 31-05-2004 à 18:09:40
Reply

Marsh Posté le 31-05-2004 à 18:14:00    

y a rien sur le man prinf  
mais je viens de me souvenir que %ld, c'est pour les long
et %lf c'est pour les double  
 
j'edite le source de mon premier post
malheuresement, ca ne fonctionne toujours pas  
 
PS : cependant je vais qd meme verifier le code format du double, ca peut etre venir de l'affichage en effet avec pintf

Reply

Marsh Posté le 31-05-2004 à 18:17:13    

%f pour les double
 
et tu vas pas trop souffir de mettre un joli int main ... return 0
 
chez moi ça marche


Message édité par Taz le 31-05-2004 à 18:19:33
Reply

Marsh Posté le 31-05-2004 à 18:21:42    

Taz a écrit :

man printf maintenant
 
(double)2.,(double)3
 
-> 2., 3. ou 2.0, 3.0 sont des double
-> pour les float, tu rajoute un f en suffix 2.0f, 3.0f


 
 
en fait je souhaiterai faire : 2 puissance a (ou a un "int" )
donc en enfet quand on met direct un nb, on peut mettre un point devant pour caster en double
mais pour les variable, il faut bien mettre "(double)a", non ?
pow ( 2. , a ),

Reply

Marsh Posté le 31-05-2004 à 18:23:41    

1 << a


Message édité par Taz le 31-05-2004 à 18:23:51
Reply

Marsh Posté le 31-05-2004 à 18:41:12    

bon ca marche  
voila, j'ai remodifié :
 

Code :
  1. [weed@localhost amusant]$ cat tpow.c
  2. #define _GNU_SOURCE
  3. #include <math.h>
  4. #include <stdio.h>
  5. int main ()
  6. {
  7.         double resultat;
  8.         int a=3;
  9.         resultat = pow (2.,(double)a);
  10.         printf("\n resultat = %f",resultat);
  11.         printf("\nFIN\n\n" );
  12.         return 0;
  13. }


 
 
ce qui est vraiment bizzare, lorsque l'on fais direct  
(double) 8 => avec un nb => ca marche pas
(double) a => variable int => ca marche
 
 
 
sinon peux tu m'expliquer a titre d'info ce que tu voulais me dire par : 1 << a;


Message édité par weed le 31-05-2004 à 18:41:51
Reply

Marsh Posté le 31-05-2004 à 19:00:47    

ben vas y essaie !

Reply

Marsh Posté le 02-06-2004 à 02:39:55    

C'est un décalage de a bits vers la gauche, qui fait exactement la meme chose qu'une multiplication par 2^a. Ça ne viendrait à l'idée d'à peu près personne d'utiliser pow() pour calculer 2^n...

Reply

Marsh Posté le 02-06-2004 à 13:23:53    

int a = 2;
1 << a;
printf("\na = %d",a);
 
ehh bien j'obtiens toujours 2.  
donc je pense qu'il faut que je convertisse "a" en binaire avec un truc du genre &0x, je pense ...
 
comme je connais pas trop les binaires, je preferes utilisé pow pour pas m'enbeter. Voilou pour info a quoi sert la fonction pow dans ma fonction   :
 

Code :
  1. int tconvert_to_dec (char *entete, int debut, int nb_bits)
  2. {
  3.  //fonction convertissant un nombre binaire en decimal
  4. //debut : à a partir de quel bits souhaitons convertir
  5. //nb_bits :  nombre de bits à traduire  
  6. //ATTENTION si l'on souhaite traduire du bits 16 à 18, nb_bits = 3 (bits 0 inclu)
  7. int i, compteur;
  8. double dec=0;     //valeur decimal de retour
  9. if (strlen (entete) > 0 && debut > 0 && nb_bits > 0)
  10. {
  11.  if ( debut + nb_bits <= strlen (entete) )
  12.  {
  13.   compteur = nb_bits-1;
  14.   for (i = debut ; i < nb_bits + debut  ; i++, compteur--)
  15.   {      //printf("\n compteur %d,entete[%d]  = %c, dec = %f",compteur,i,entete[i],dec);
  16.    if (entete[i]=='1')
  17.    {
  18.     dec += pow (2.,(double)compteur);
  19.    }
  20.   }
  21.   return ((int)dec);
  22.  }
  23.  else
  24.  {
  25.   printf("\nErreur conversion binaire -> decimal\n lg entete < debut + off set\n" );
  26.   return (-1);
  27.  }
  28. }
  29. else
  30. {
  31.  printf("Erreur argument : conversion binaire -> decimal\n lg enete <=0 ou debut < 0 ou offset < 0\n" );
  32.  return (-1);
  33. }
  34. }


 
c'est pas tres optimisé mais ca fonctionne parfaitement ;)


Message édité par weed le 02-06-2004 à 13:27:42
Reply

Marsh Posté le 02-06-2004 à 13:23:53   

Reply

Marsh Posté le 02-06-2004 à 13:57:10    

Code :
  1. int a = 2;
  2. int b = 1 << a;
  3. printf("\nb = %d",b);


ça devrait aller mieux


Message édité par cricri_ le 02-06-2004 à 13:58:05
Reply

Marsh Posté le 02-06-2004 à 14:19:07    

ohh l'idiot que je suis  
mais bien sur  
et bien des que j'aures terminé mon prog j'essarais de faire ca car c'est qd meme plus propre un decalage à gauche

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed