[C] besoin important d'une info sur les nombres à virgule flottante

besoin important d'une info sur les nombres à virgule flottante [C] - C - Programmation

Marsh Posté le 07-12-2003 à 00:52:16    

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 :D
 
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?

Reply

Marsh Posté le 07-12-2003 à 00:52:16   

Reply

Marsh Posté le 07-12-2003 à 01:16:18    

http://cch.loria.fr/documentation/ [...] ldberg.pdf
http://docs.sun.com/source/806-3568/ncgTOC.html
 
ln 2 / ln 10 * Nbits
 
au chapitre IEEE


Message édité par Taz le 07-12-2003 à 01:24:25
Reply

Marsh Posté le 07-12-2003 à 01:31:04    

Merci beaucoup Taz, deja d'avoir eu le courage de lire mon topic :D puis d'etre venu m'aider.
 
je n'ai jeté qu'un rapide coup d'oeuil aux liens que tu m'a fournis, et apparement la methode de calcul pour determiner le nombre de chiffres garantis est bien plus compliqué que ce que j'imaginais :/
 
je lirais ca demain a tete reposée, mais si c'est aussi compliqué que ce que tes documents semblent indiquer, je sens que je vais devoir me préparer une petite antiseche  :p

Reply

Marsh Posté le 07-12-2003 à 01:33:34    

Dans les nombres flottants, la virgule se place toujours après le premier chiffre et après on applique l'exposant. Donc ton 12345.6789 est en fait "1.23456789e4" et comme ça tu vois bien que tu depasses la capacité maximale de 6 chiffres après la virgule.

Reply

Marsh Posté le 07-12-2003 à 21:11:01    

En effet kristoph  :D  
 
sinon taz, quand j'applique la formule que tu ma donné, je retombe sur 19  :p  
 
Vu que le temps presse (j'ai jusqu'a lundi prochain pour connaitre le B.A.BA du C) je n'ai pas le temps de lire les docs de tes liens, mais merci quand meme :)
 
quelqu'un pourrait il me dire finallement combien de chiffre apres la virgule sont garantis avec un long double? 17? 19? plus? moins?
 
encore merci [:acherpy]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed