Titre: Mathématiques dans le C Posté par: Matsui le 23 Janvier 2015 à 11:25:09 Bonjour tout le monde. Moi c'est Matsui, je viens de débuter le C et je fais quelques exos. Le C en lui même ça va, logique, tout va bien, par contre je bute pas mal sur les notions mathématiques étant issu d'une filière littéraire. Voici mon problème :
J'ai fais un exercice, il s'agissait de comprendre le code suivant et de donner les résultats avant de le compiler, mes commentaires sont mes réponses : Code: #include <stdio.h> int main () { int n = 543 ; int p = 5 ; float x = 34.5678 ; printf ("A : %d %f\n", n, x) ; /* affiche correctement, int 543 et float 34.567800 */ printf ("b : %4d %10f\n", n, x) ; /* affiche ^543, ^34.567800*/ printf ("C : %2d %3f\n", n, x) ; /*affiche 543, car printf affiche le nombre de gabarit nécessaire, 34.5678 */ printf ("d : %10.3f %10.3e\n", x, x) ; /*affiche, ^^^^34.567, ^^^^34.567e+000*/ printf ("e : %*d\n", p, n);/* 543 suivit de 5 espaces*/ printf ("f : %*.*f\n", 12, 5, x); // ^^^34.5678 } voici le résultat Citation A : 543 34.5677986145 J'ai a peu près bon, mais pourquoi printf n'affiche les 800 ? J'ai plus ou moins compris le concept de contracture, mais pourquoi ? Le Float n'est pas assez grand pour le contenir ? J'y ai pensé mais j'y crois moyen. b : 543 34.567799 C : 543 34.567799 d : 34.568 3.457e+01 e : 543 f : 34.56780 Voilà, merci à vous. Titre: Re : Mathématiques dans le C Posté par: matthieu1984 le 24 Janvier 2015 à 17:40:29 Salut Matsui,
Lorsque tu manipules des float ou des double en C, tu auras le plus souvent des résultats approximatifs pour la raison suivante: Code: % cat /tmp/a.c #include <stdio.h> int main() { printf("taille de float:\t%d\n", sizeof(float)); printf("taille de double:\t%d\n", sizeof(double)); return 0; } % gcc /tmp/a.c && ./a.out taille de float: 4 taille de double: 8 % Ce qui veut dire que le float est ici d'une taille de 4 octets (32 bits) et le double est d'une taille de 8 octets (64 bits) Pour le stockage interne c'est un système de mantisse et exposant Code: valeur = signe × mantisse × 2^(exposant − décalage) Pour le type float, le signe est sur 1 bit, l'exposant sur 8 bits et la mantisse prend le reste. C'est comme ça que c'est stocké en machine. Après, printf se débrouille pour te l'afficher mais du coups ça sera approximatif.Je te renvoie à la lecture de l'article wikipedia pour plus de détails : http://fr.wikipedia.org/wiki/IEEE_754 En espérant avoir répondu à ta question... Matt Titre: Re : Mathématiques dans le C Posté par: Matsui le 26 Janvier 2015 à 20:16:15 Merci, tu as tout à fait répondu à ma question. C'est donc bien une histoire de stockage et d'arrondi.
Merci bonne soirée à toi ! |