salut tout le monde.
voila je découvre les joies du langage C, car pour acceder a une formation C++ j'ai un examen en C a passer dans 1 smaine. j'ai ete initié au java donc j'ai un peu d'espoire
Je bloque sur un detail a la con sur un bouquin concernant la precision des nombres a virgule flottante, si vous pouviez lire ce post et me répondre ca serait vraiment hyper sympa. je decris ici ce que je lis, comment je l'interprete, et où je bloque. je suis loin d'etre un bon en math, mais je ne suis pas une burne non plus, merci donc pour votre indulgence
voici ce qui est ecrit dans le livre :
float : 1 bit de signe, 8 bit pour l'exposant , 23 bits pour la mantisse, et la precision est garantie a au moins 6 chiffres apres la virgule. |
ok vérifions tout ca: 1+8+23 =32bits = 4octets, ca colle, super!
voyons maintenant pour la precision : 2^23 = 8388608 ,c'est un nombre a 7 chiffres, ca nous donne bien 6 chiffres "complets" plus le chiffre le plus fort ne pouvant monter qu'à 8.
encore super j'ai pu vérifier les dires du livre, j'obtiens bien par mes calculs un resultat de 6 chiffres garantis. Mais j'en arrive a ma premiere question :
le livre dit
"6 chiffres garantis apres la virgule" |
, mais une chose me choque: si par exemple je saisi 12345.6789, je n'ai que 4 chiffres apres la virgule, donc d'apres le livre je suis ok.
Ce nombre equivaut à 123456789e-4, ok maintenant je regarde de nouveau la taille de la mantisse pour un float, elle est sur 23 bits, ce qui nous fait une plage de valeur possible entre 0 et 8388608. Oh Oh 8388608 est inferieur à 123456789, alors si je comprend bien on a avec un float 6 chiffres garantis mais en tout et pour tout, et non apres la virgule comme indiqué dans le livre. Ai je bien saisi ou est ce que je me lance sur une mauvaise voie là?
et voici la partie la plus importante a mes yeux :
je vous passe les details pour les doubles, car j'ai fait la meme vérif, et ca colle.
passons au long double, le livre annonce :
15bits pour l'exposant , 64 pour la mantisse, 1 pour le signe et 17 chiffres garantis apres la virgule. |
on vérifie, 15+64+1=80bits=10octets, super ca colle.
on passe a la précision : 2^64 = 18446744073709551616
et la je compte 19 chiffres "complets" plus le chiffre le plus fort ne pouvant pas depasser 1.
oui mais le livre dit 17 chiffres et non 19, j'ai fait un petit programme de test et en effet je n'ai que 17 chiffres precis, apres c'est arrondi.
voici donc ma question : quel est la methode pour calculer le nombre de chiffre precis sur les nombres a virgule flottante, ou autrement dit qu'est ce qui cloche dans mon raisonnement?