Bonsoir
J’ai fait ce programme qui calcul une valeur approchée de la racine carrée d’un nombre en utilisant des flottants :
#include <stdio.h>
#include <stdlib.h>
int main ()
{
float n ;
int r, i ;
float res = 1 ;
printf("Entrez un nombre !!\n") ;
while (scanf("%f", &n) == 0) getchar () ;
printf("Entrez le rang de calcul !!\n") ;
while (scanf("%d", &r) == 0) getchar () ;
for (i=1; i<=n; i++) res = (n/res + res) / 2 ;
printf("racine carrée de %.2f au rang %d : %.20f\n",n,r,res) ;
return EXIT_SUCCESS ;
}
Ce programme ayant un problème de précision, j’ai remplacé les déclarations float par double, mais maintenant printf m’affiche n’importe quoi !!
C’est (presque) marqué dans mon message précédent.
Loin de moi l’idée de vouloir paraître désagréable, mais savoir “lire le manuel” (comprendre la documentation / faire des recherches par soi-même / etc) est absolument indispensable pour tout programmeur, et un programmeur débutant doit apprendre ça aussi, car c’est une partie intégrante du “savoir programmer”.
Je pense que c’est beaucoup mieux pour toi si tu cherches cette info par toi-même (surtout que je t’ai donné des sacrées pistes là, et que l’info est facile à trouver – j’ai mis moins de 10 minutes à trouver le problème dans ton programme, chercher et lire la doc correspondante, et enfin corriger, alors que je n’utilise pour ainsi dire jamais scanf/printf et que je n’ai donc qu’une très vague idée de comment ils fonctionnent).
Par contre ce que je peux faire c’est t’expliquer comment j’ai procédé pour trouver l’origine du problème. Normalement j’aurais tendance à afficher la valeur des différentes variables, mais vu que là ça semblait être un problème d’affichage justement, j’ai fait l’inverse : j’ai donné des valeurs arbitraires aux variables et j’ai regardé si elles s’affichaient bien (c’était le cas) donc le problème ne pouvait venir que de l’entrée, à savoir le scanf("%f"…). J’ai cherché la doc de cette fonction sur internet et le tour est joué.
En bref, pour corriger un bug :
trouver sa cause en procédant par élimination
comprendre pourquoi le code en question est mauvais, souvent en se rapportant à la doc correspondante pour vérifier qu’on utilise correctement la fonction
La seule solution que j’ai trouvée est de lire une chaine de caractère et de faire appel à la fonction de conversion strtod.
Cela ne me semble pas terrible comme solution mais ça marche, c’est déjà ca