fonction hypot ( ) retourne systématiquement 1 !!!!! - C - Programmation
Marsh Posté le 01-05-2006 à 00:26:02
jipo a écrit : J'utilise la fonction hypot de la libriairie math.h. |
Code non compilable. Poste le code complet compilable mais réduit au minimum qui montre le défaut.
(avec mon code de test, je n'ai pas le problème signalé) :
Ddep = 7256.031973 |
Marsh Posté le 01-05-2006 à 11:45:14
Voici un code réduit qui me pose problème :
Code :
|
Ddep1 contient la bonne valeur mais Ddep2 contient 1 apres appel de hypot ...
Mon système fedora core 4 serait vérolé ???
Marsh Posté le 01-05-2006 à 11:59:34
est tu sûr? moi ça fonctionne.
qq remarques:
- hypot() peut s'avérer plus lent sur certains systèmes
- sqrt() est très lente comme fonction, vérifie que tu en a vraiment besoin
Marsh Posté le 01-05-2006 à 12:10:55
Ci-dessous mon makefile :
Code :
|
Marsh Posté le 01-05-2006 à 12:12:30
nargy a écrit : est tu sûr? moi ça fonctionne. |
Non j'ai pas besoin de sqrt ( )
Je l'ai mis là juste pour test car cet appel est sensé me fournir le meme résultat que hypot, non ?
Marsh Posté le 01-05-2006 à 12:17:00
ce que je voulais dire, c'est que si tu a simplement besoin de comparer deux rayons, tu peut te passer de la racine carrée, puisque lorsque x>0 et y>0:
x=y <=> x²=y²
x>y <=> x²>y²
Marsh Posté le 01-05-2006 à 12:24:53
Non en fait il s'agit d'obtenir des distances à partir de coordonnées
Marsh Posté le 01-05-2006 à 13:19:12
jipo a écrit : Voici un code réduit qui me pose problème : |
Comment tu la sais ? Tu ne fais pas d'affichage. Chez moi, avec le debugger, c'est OK :
Et avec printf() aussi :
Code :
|
|
Marsh Posté le 01-05-2006 à 15:22:25
Je vérifie le contenu de la variable Ddep dans DDD. Il m'affiche systématiquement 1.
Je vois que tu utilises codeblocks. Est-ce que c'est bien ? On peut debugger via l'ide ? Le debugger mieux ou moins bien que ddd ?
Marsh Posté le 01-05-2006 à 15:58:55
jipo a écrit : Je vérifie le contenu de la variable Ddep dans DDD. Il m'affiche systématiquement 1. |
J'ai tapé ton code tel quel, comme l'a fait Emmanuel, et chez-moi ça me donne comme pour Emmanuel la bonne valeur.
Au lieu d'utiliser un débuggeur (l'utilises-tu correctement ?) fais donc un simple printf("%f - %f\n", Ddep1, Ddep2) en fin de main...
Tu trouveras code::Blocks ici: http://www.codeblocks.org
Marsh Posté le 01-05-2006 à 22:08:29
J'ai fait exactement ce que vous avez demandé :
J'obtiens :
Code :
|
Voilà. Donc il y a un problème ! Je devrais pas en être fier
Marsh Posté le 01-05-2006 à 23:07:08
jipo a écrit : J'ai fait exactement ce que vous avez demandé :
|
Hum, je dirais bien qu'il faut débugger l'interface chaise<->clavier mais ça risque de vexer
Bon, j'ai pas d'idée sur la cause réelle de l'erreur. La seule chose que je puisse proposer est que tu testes ton pgm sur un autre système (ptet que "hypot" n'est pas implémenté sur Fedora ?)
Une solution pas trop destructrice serait que tu télécharges une version "move" de Linux pour que tu puisses tester rapidement ton pgm sans avoir besoin de tout réinstaller...
Marsh Posté le 02-05-2006 à 07:45:59
jipo a écrit : J'ai fait exactement ce que vous avez demandé :
|
ça n'est pas la sortie du programme minimale qu'à donner Emmanuel. Teste le telquel.
Marsh Posté le 02-05-2006 à 10:41:13
jipo a écrit : J'ai fait exactement ce que vous avez demandé :
|
Je viens de tester sur une Aurox le code (minimal) suivant :
|
J'obtiens 18,027756...
[:edit:] J'avais oublié les guillemets fermants
Marsh Posté le 02-05-2006 à 10:44:14
Aussi taudis aussi teuffait ...
Et voici la sortie :
Ddep1 = 7256.031973
Ddep2 = 1.000000
Pour info : IL S'AGIT D'UNE AUTRE MACHINE : RED HAT AS 4 64bits. Chez moi c'était une fedora core 4 64 bits : dans les deux cas il y a anomalie
Des idées. Problème de config ? Mon makefile ? Pas les bonnes libs ?
Je sais plus moi ...
Marsh Posté le 02-05-2006 à 10:49:06
Sve@r a écrit : Je viens de tester sur une Aurox le code (minimal) suivant :
|
Avec l'exemple minimaliste, j'obtiens :
0.000000
Marsh Posté le 02-05-2006 à 10:55:49
Sve@r a écrit : Je viens de tester sur une Aurox le code (minimal) suivant : |
Ne compile pas !
Code :
|
18.027756 |
Marsh Posté le 02-05-2006 à 10:56:08
Ah une piste ...
Effectivement : des valeurs entre 0 et 1 ...
Et alors y a-t-il un parametrage particulier ? Un paramètre qui serait pas bon qqpart ?
Marsh Posté le 02-05-2006 à 11:00:53
Emmanuel Delahaye a écrit : Ne compile pas !
|
Implicitement si après correction ... ce qui avait été fait ...
Marsh Posté le 02-05-2006 à 11:06:28
jipo a écrit : Aussi taudis aussi teuffait ... |
Pas besoin de Makefile pour ça
cc -c toto.c
cc -lm toto.o -o toto
jipo a écrit : Je sais plus moi ... |
Nous (moi) non plus
Marsh Posté le 02-05-2006 à 11:10:08
Idem.
J'ai tout testé de mon côté (Solaris 8), y compris l'inclusion des bibliothèques 64-bits du monsieur (inutile, bien sûr)... rien. Nada. Que dalle.
Marsh Posté le 02-05-2006 à 11:10:21
jipo a écrit : Ah une piste ... |
As-tu fait "man hypot" sur tes machines 64 bits ? Il y a peut être un bug, une remarque...
Ce que je constate déjà, c'est que ce n'est pas une fonction standard C99. Vu du langage C, le comportement est donc indéfini. rien à dire. Le 1 (ou le 0) sont 'normaux', puisque tout peut arriver...
Par contre, elle existe en C99.
Citation : n1124 |
Quel est ton compîlateur (version etc.)
Marsh Posté le 02-05-2006 à 11:13:37
Voici la page :
|
Marsh Posté le 02-05-2006 à 11:24:20
Avec la simple compile depuis cc ci-dessus, j'obtiens le bon résultat ... bizarre non ?
Que pensez-vous de mes options de compilation dans le makefile ?
Apres test de la compile et du link sans les options -Wall -ansi le programme renvoit le bon résultat !
-Wall -ansi ?????
J'aimerais bien avoir le fin mot de l'histoire ....
Marsh Posté le 02-05-2006 à 11:28:35
gcc -v :
|
Marsh Posté le 02-05-2006 à 11:31:42
jipo a écrit : J'aimerais bien avoir le fin mot de l'histoire .... |
Ben ta machine est pourrie. Mais pour te faire plaisir, je te la rachète 100... non 150 euro...
Marsh Posté le 02-05-2006 à 11:33:24
normal, -ansi tu fais disparaitre les proto des fonctions pas ansi. ça doit gueuler. résultat, gcc synthétise un proto pour hypt tel que int hypot(int) ... et donc ça chie. c'est typique.
c'est la même chose que l'histoire de malloc sans <stdlib.h>
Marsh Posté le 02-05-2006 à 11:34:46
Je peux pas la revendre ... C'est une lame 64 bits qui coute les yeux de la tête à mon employeur ...
Marsh Posté le 02-05-2006 à 11:36:53
jipo a écrit : Avec la simple compile depuis cc ci-dessus, j'obtiens le bon résultat ... bizarre non ? |
-ansi force le mode C90. En C90, hypot() n'est pas définie. Le comportement est donc indéterminé.
Essaye -std=c99 à la place.
Marsh Posté le 02-05-2006 à 11:37:24
Taz a écrit : normal, -ansi tu fais disparaitre les proto des fonctions pas ansi. ça doit gueuler. résultat, gcc synthétise un proto pour hypt tel que int hypot(int) ... et donc ça chie. c'est typique. |
Conclusion : Il faut juste que je compile sans -ansi ? Ou alors y a-t-il une définition de fonction pour hypot dans une autre lib qui soit compatible avec l'option -ansi ?
Désolé je démarre sous Linux ... et en plus en C ...
Marsh Posté le 02-05-2006 à 11:46:34
jipo a écrit : Conclusion : Il faut juste que je compile sans -ansi ? Ou alors y a-t-il une définition de fonction pour hypot dans une autre lib qui soit compatible avec l'option -ansi ? |
Je viens de te le dire : Retire -ansi et mets -std=c99 à la place. Il faut lire les réponses, on va pas passer notre temps à se répéter indéfiniment...
Je conseille :
-Wall -Wextra -O2 -std=c99 |
Et C99, c'est du C. (Rien à voir avec Linux)
Marsh Posté le 02-05-2006 à 11:49:12
Emmanuel Delahaye a écrit : -ansi force le mode C90. En C90, hypot() n'est pas définie. Le comportement est donc indéterminé. |
Hum, ya qqchose qui m'échape
-ansi force le code à être écrit à la norme ansi. Mais en quoi cette écriture empêche-t-elle d'exécuter une fonction déjà écrite et compilée et présente dans la librairie "libm" (et probablement prototypée dans "math.h" ) ?
Marsh Posté le 02-05-2006 à 11:49:15
Emmanuel Delahaye a écrit : -ansi force le mode C90. En C90, hypot() n'est pas définie. Le comportement est donc indéterminé. |
Merci :
Effectivement cela fonctionne.
Est-ce une situation normale ? Je veux dire : est-ce normal dans mon cas d'utiliser -std=c99 en lieu et place de -ansi ? Ou alors c'est juste une rustinerie pour que cela marche chez moi ?
Ou autrement dit : Est-ce que mes options de compil étaient nulles et moi avec ?
En tout cas merci à tous
Marsh Posté le 02-05-2006 à 11:51:27
A part la page gnu.org sur gcc, y a-t-il une autre source de documentation avec des EXEMPLES sur l'utilisation de gcc ?
Marsh Posté le 02-05-2006 à 12:54:45
Sve@r a écrit : -ansi force le code à être écrit à la norme ansi. Mais en quoi cette écriture empêche-t-elle d'exécuter une fonction déjà écrite et compilée et présente dans la librairie "libm" (et probablement prototypée dans "math.h" ) ? |
-ansi a le même sens que -std=c90. Ca provoque probablement la mise en commentaire des prototypes des fonctions non conformes à C90. L'appel se faisant sans prototype (activer les warnings...), le comportement est indéterminé.
Marsh Posté le 02-05-2006 à 12:59:02
jipo a écrit : |
Ben oui. Tu utilises une fonction de C99. Il est normal de s'assurer que le compilateur est bien utilisé dans le bon mode...
Marsh Posté le 02-05-2006 à 13:24:05
Emmanuel Delahaye a écrit : Ca provoque probablement la mise en commentaire des prototypes des fonctions non conformes à C90. |
Evidemment - Partant de là...
Marsh Posté le 02-05-2006 à 13:35:12
Sve@r a écrit : Evidemment - Partant de là... |
C'est logique non ? Les modes -ansi ou -std=xxx sont des modes stricts. Pas d'extension.
On est pas obligé de les utiliser, mais attention à la portabilité (il n'y a pas gcc partout !)
Marsh Posté le 30-04-2006 à 23:59:02
AU SECOURS ! ! !
J'utilise la fonction hypot de la libriairie math.h.
Quelque soient les valeurs passées (des doubles) elle me renvoit 1 ....
Voici le code :
....
double dxb = (double)xb;
double dyb = (double)yb;
double toto = hypot(dxb, dyb);
toto = hypot(6300.0, 3600.0);
Ddep = hypot(dxb,dyb);
....
J'ai xb = 6300 et yb = 3600
dans tous les cas les variables toto et Ddep reçoivent la valeur 1 dans le debugger DDD.
JE COMPREND RIEN ..... bouhouhouhou ...
---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)