Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1520 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°746448
weed
Posté le 31-05-2004 à 18:05:03  profilanswer
 

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
mood
Publicité
Posté le 31-05-2004 à 18:05:03  profilanswer
 

n°746460
Taz
bisounours-codeur
Posté le 31-05-2004 à 18:08:38  profilanswer
 

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
n°746471
weed
Posté le 31-05-2004 à 18:14:00  profilanswer
 

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

n°746475
Taz
bisounours-codeur
Posté le 31-05-2004 à 18:17:13  profilanswer
 

%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
n°746480
weed
Posté le 31-05-2004 à 18:21:42  profilanswer
 

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 ),

n°746481
Taz
bisounours-codeur
Posté le 31-05-2004 à 18:23:41  profilanswer
 

1 << a


Message édité par Taz le 31-05-2004 à 18:23:51
n°746497
weed
Posté le 31-05-2004 à 18:41:12  profilanswer
 

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
n°746519
Taz
bisounours-codeur
Posté le 31-05-2004 à 19:00:47  profilanswer
 

ben vas y essaie !

n°748388
matafan
Posté le 02-06-2004 à 02:39:55  profilanswer
 

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...

n°748780
weed
Posté le 02-06-2004 à 13:23:53  profilanswer
 

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
mood
Publicité
Posté le 02-06-2004 à 13:23:53  profilanswer
 

n°748806
cricri_
Posté le 02-06-2004 à 13:57:10  profilanswer
 

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
n°748841
weed
Posté le 02-06-2004 à 14:19:07  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Probleme de soustraction de doublecontrole de la saisie d'un double
Swing et le double-buffering.Double lien sur iframe
Bug ie double margin avec les float[shell] le double $
[MYSQL] prob bizarre ma requete ne me renvoi que le premier résultatconvertir un double ou un float en string ou en char
[C++] conversion double en int ?[C++] nombre de décimaux dans un double qu'on écrit dans un fichier
Plus de sujets relatifs à : [c]pourquoi pow ((double)2,(double)3) renvoi 0 et non pas 8 ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR