logarithme en C

logarithme en C - C - Programmation

Marsh Posté le 28-11-2004 à 12:02:00    

bonjour, voici mon code :

Code :
  1. #include <math.h>
  2. #include <stdio.h>
  3. int main()
  4. {
  5. float n = 3456;
  6. printf("%f\n",log2f(n));
  7. }


 
je compile  

Code :
  1. gcc -o log log.c -lm


 
et ca me renvoit toujours 0.00000
 
Où est le problème?

Reply

Marsh Posté le 28-11-2004 à 12:02:00   

Reply

Marsh Posté le 28-11-2004 à 12:13:04    

J'ai fait exactement ce que tu as fait et ça me retourne "-1.999104" (je ne sais pas si c'est correct :D).


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 28-11-2004 à 12:13:27    

essaye float n = 3456.0

Reply

Marsh Posté le 28-11-2004 à 12:16:37    

Dans ce cas c'est plutot 3456.0f (sinon c'est un double)

Reply

Marsh Posté le 28-11-2004 à 12:18:52    

c0wb0y a écrit :

essaye float n = 3456.0

déjà ça c'est une constante double, et pas float
 
 
axelazerty > déjà si tu compiles en -Wall tu vois, qu'il trouve pas la fonction. Donc y a un problème. Comme un grand tu ouvres le man, et tu vois que log2f est spécifique à C99. Donc au final, ton CFLAGS doit être:
--> -Wall -std=gnu9x   / C99 + extension GNU
--> -Wall -std=c99     / C99 uniquement
 
 
PS : tout ça c'est l'eternel histoire du type par défaut. une fonction qui n'a pas de prototype se verra assigné un prototype 'int f(int)'. Donc ici, ça a un effet très visible. Conclusion : toujours compilé en -Wall.


Message édité par Taz le 28-11-2004 à 12:44:06
Reply

Marsh Posté le 28-11-2004 à 13:45:35    

avec -std=gnu9x ca fonctionne.
Merci beaucoup.
 
a propos de ton "PS", log2f() n a pas de prototype?

Reply

Marsh Posté le 28-11-2004 à 13:46:33    

ben si, mais gcc peut pas l'inventer !

Reply

Marsh Posté le 28-11-2004 à 13:47:38    

et pourquoi ne le connait il pas ?
il est defini dans math.h pourtant.

Reply

Marsh Posté le 28-11-2004 à 14:07:41    

il est défini dans math.h si tu fais du C99 :o
t'es long à la détente ...

Reply

Marsh Posté le 28-11-2004 à 14:10:28    

axelazerty a écrit :

et pourquoi ne le connait il pas ?
il est defini dans math.h pourtant.


Taz te dit que c'est défini dans math.h en C99, et par défaut gcc ne compile pas en C99 (C89?)
 
Donc si tu ne lui dit pas "compile en C99", il n'a pas le bon math.h donc il n'a pas la bonne fonction (ou pas la fonction du tout) :sol:


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 28-11-2004 à 14:10:28   

Reply

Marsh Posté le 28-11-2004 à 14:11:18    

okay j ai compris :)
merci

Reply

Marsh Posté le 01-12-2004 à 10:04:22    

darkoli a écrit :

J'ai fait exactement ce que tu as fait et ça me retourne "-1.999104" (je ne sais pas si c'est correct :D).

Non. Pour que le log soit < 0, il faut que 0 < x < 1.
(rappel : log est une fonction strictement croissante définie sur ]0, +infini[, négative sur ]0,1[, positive ou nulle pour x >= 1)


Message édité par el muchacho le 01-12-2004 à 10:08:37
Reply

Marsh Posté le 01-12-2004 à 10:31:03    

oui pour un logarithme néperien. la c'est un log binaire donc ln(n)/ln(2)

Reply

Marsh Posté le 01-12-2004 à 11:39:35    

printf("%lf\n",log2f(n)); //Avec un L minuscule


Message édité par lsdYoYo le 01-12-2004 à 11:40:08
Reply

Marsh Posté le 04-12-2004 à 16:28:26    

heink ?

Reply

Marsh Posté le 04-12-2004 à 16:40:19    

lsdyoyo a écrit :

printf("%lf\n",log2f(n)); //Avec un L minuscule


Non. Tu confonds avec scanf()...

Code :
  1. printf("%f\n",log2f(n));


est correct.
 
En fait, le 'f' de 'log2f()' signifie float. Mais printf() convertit automatiquement un float en double, donc le format est bien "%f" (car pour printf(), "%f" signifie 'au format double'. Oui, c'est pas simple, parce que avec scanf(), "%f" signifie 'adresse d'un float', et "%lf" adresse d'un double...


Message édité par Emmanuel Delahaye le 04-12-2004 à 16:46:17

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-12-2004 à 16:55:23    

mais si tu tiens vraiment à faire tes calculs en long double, il y a une variante de log2 -> long double log2l(long double)
 
voire même dans <tgmath.h> pour ne plus s'embêter :)

Reply

Sujets relatifs:

Leave a Replay

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