Des FP32 pas standard

Vous avez peut-être l’habitude des nombres à virgule flottantes 32 bits IEEE-754 avec 23 bits de mantisse (24 bits effectif grace à la normalisation), 8 bits d’exposant et 1 bit de signe. La mantisse est un peu courte, mais il y a beaucoup d’usages pour lesquels ça reste tolérable.

Mais, savez-vous que le logiciel statistique SAS n’utilise pas cette représentation lorsqu’on stocke une valeur numérique de 4 octets dans un dataset, sous Windows ou Linux, sur PC ? Il utilise une mantisse 20 bits (21 bits effectif), 11 bits d’exposant et 1 bit de signe. Cela lui permet d’avoir la même étendue d’exposant qu’avec un FP64 IEEE-754.

En conséquence, dès qu’on dépasse les deux millions environ, on ne peut plus représenter un nombre entier de manière exacte:

data test;                                                                                                                              
        length x1 4 x2 4 x3 4;                                                                                                          
        x1=2097151; /* 2 puissance 21 moins 1 */                                                                                        
        x2=x1+1;                                                                                                                        
        x3=x2+1;                                                                                                                        
run;                                                                                                                                    
proc print data=test;run;

Va afficher le tableau:

Obsx1x2x3
1209715120971522097152

SAS gère aussi des FP24 avec seulement 12 bits de mantisse (13 effectifs), ce qui limite la représentation exacte des nombres entiers à 8192.

En pratique, la représentation dépend de la plateforme. Comme SAS a un format de fichier interne incompatible entre les plateformes, incapable même de communiquer entre la plateforme PC 32 bits et 64 bits, les fichiers d’une plateforme ne peuvent de toute façon pas être ouverts sur une autre plateforme; il n’y a pas non plus d’utilitaire de conversion avec SAS.

Comme SAS ne gère pas les nombres entiers, mais seulement les nombres à virgule flottante, je vous conseille d’avoir bien conscience de ces limites avant de décider du nombre d’octets à allouer aux valeurs. Si vous ne voulez pas avoir à réfléchir, utilisez toujours les 8 octets de la représentation par défaut.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *