logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» Mathématiques dans le C
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Mathématiques dans le C  (Lu 4307 fois)
Matsui
Profil challenge

Classement : 40758/54278

Néophyte
*
Hors ligne Hors ligne
Messages: 2


Voir le profil
« 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.
Journalisée
matthieu1984
Profil challenge

Classement : 259/54278

Néophyte
*
Hors ligne Hors ligne
Messages: 15


Voir le profil
« #1 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
« Dernière édition: 25 Janvier 2015 à 09:27:18 par matthieu1984 » Journalisée
Matsui
Profil challenge

Classement : 40758/54278

Néophyte
*
Hors ligne Hors ligne
Messages: 2


Voir le profil
« #2 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 !
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: