NewbieContest

Programmation => Langages compilés => Discussion démarrée par: Matsui le 23 Janvier 2015 à 11:25:09



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
b :  543  34.567799
C : 543 34.567799
d :     34.568  3.457e+01
e :   543
f :     34.56780
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.
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 !