Fonctions élémentaires : algorithmes et implémentations efficaces pour l’arrondi correct en double précision

Fonctions élémentaires : algorithmes et implémentations efficaces pour l’arrondi correct en double précision

 Problèmes et limites de la norme

Nous avons vu que la norme est composée d’un ensemble de règles plus ou moins contraignantes. Il est donc rare de trouver des constructeurs qui prennent en charge la norme IEEE-754 entièrement en matériel. Le respect de la norme IEEE-754 s’articule autour d’un ensemble composé du processeur, du système d’exploitation, des bibliothèques ainsi que des compilateurs. La répartition des responsabilitées pour la conformité à la norme IEEE-754 entre chacun de ces éléments varie d’un système à un autre. Un logiciel tel que PARANOIA de Karpinski [56] permet de détecter si un système donné respecte la norme. Ce logiciel est écrit en langage C, et teste si l’ensemble composé du langage, du compilateur, des bibliothèques, du système et du processeur est cohérent vis-à-vis de la norme IEEE-754. La suite décrit quelques exemples de problèmes que l’on peut rencontrer avec des systèmes non-cohérents 

Doubles étendus

Comme le fait remarquer Goldberg [38], l’utilisation implicite des doubles étendus peut également engendrer des comportements inattendus. Il donne l’exemple suivant (qui ne fonctionne pas tel quel avec le compilateur gcc dont les optimisations masquent le problème) : 1 i n t main ( ) { 2 double q ; 3 4 q = 3 . 0 / 7 . 0 ; 10 CHAPITRE 1. VIRGULE FLOTTANTE 5 i f ( q = = 3 . 0 / 7 . 0 ) p r i n t f ( ’ ’ equal \ n ’ ’ ) ; 6 e l s e p r i n t f ( ’ ’ no t equal \ n ’ ’ ) ; 7 r e tu rn 0 ; 8 } Dans cet exemple, comme spécifié par la norme C99 [6], les constantes 3:0 et 7:0 ainsi déclarées sont codées par des flottants double précision. Mais sur une architecture avec des doubles étendus, comme les architectures x86 ou le 68000, l’opération 3:0=7:0 est effectué avec des doubles étendus et le résultat ne sera converti que lors de son transfert vers la mémoire. Si l’un des deux résultats transite par la mémoire mais pas l’autre, alors l’égalité ne sera pas respectée. Un problème similaire peut se produire lors de calculs aux abords des limites de codage des nombres flottants. Par conséquent, si une suite de calcul génère un dépassement de capacité vers l’infini, pour ensuite revenir dans le domaine de représentation des nombres IEEE sans transiter par la mémoire alors le résultat final ne conservera aucune trace de ce dépassement de capacité. Pour éviter les effets de l’excès de précision apporté par ces registres, une solution est de forcer les données à transiter par la mémoire. Cette opération est réalisée par le compilateur. Avec le compilateur gcc, il faut utiliser le drapeau de compilation -ffloat-store. Une autre solution est de définir correctement le registre de contrôle de précision et de mode d’arrondi. Sur un processeur de type x86 avec une distribution linux, il existe un fichier d’entête fpu_ ontrol.h qui définit les instructions à utiliser pour forcer le processeur à travailler sur des doubles. Le code suivant pau plus près, double précision’. 1 # inc lude < f p u _ c o n t r ol . h> 2 # i fnd e f __se t_ fpu_cw 3 # def ine __se t_ fpu_cw (cw ) __asm__ (  » fldcw %0  » : : « m » ( cw ) ) 4 # end if 5 # i fnd e f _FPU_DBPREC 6 # def ine _FPU_DBPREC 0 x 0 2 7 f 7 # end if 8 9 . . . 10 11 __se t_ fpu_cw ( 0 x 0 2 7 f ) ; 12 /  T r a v a i l en mode d o u b l e p r é c i s i o n a v e c  13  a r r o n d i au pl u s p r è s  / 14 . 

Le FMA

L’opération de Fused Multiply and Add ou FMA, introduite par IBM sur le RS/6000, permet d’effectuer a + (b  ) en une seule opération et avec un seul arrondi final. Il est très utile pour l’évaluation polynomiale ou l’approximation logicielle de la division ou de la racine carré. Cet opérateur est plus précis et plus rapide que la suite d’opérations composée d’une multiplication suivie d’une addition. En effet le FMA n’effectue qu’une seule étape d’arrondi. Cependant, en ne commettant qu’une seule erreur, cet opérateur n’est pas conforme à la norme IEEE-754. La norme impose que le résultat d’une opération flottante qui n’est pas représentable dans le format de destination soit arrondi, or le FMA conserve toute la précision entre la multiplication et l’addition. Le respect de la norme sur les architectures offrant le FMA, telles que les PowerPC  ou Itanium, est laissé au soin du compilateur. Néanmoins des discussions sont en cours pour l’inclure dans la future révision de la norme [7]. Les exceptions Les architectures modernes proposent un registre spécial pour la gestion des exceptions flottantes. Il est en revanche laissé au soin du compilateur ou du système d’exploitation d’interpréter correctement ce registre. Par exemple, sur le PowerPC, ce registre de 32 bits s’appelle ’Floating-Point Status and Control Register’ (FPSCR). Il est mis à jour après chaque opération flottante, et contient des informations sur les exceptions IEEE, plus quelques autres facilitant leurs gestions, notamment celles relatives aux opérations invalides. Pour accélérer les calculs, le PowerPC possède également un mode non respect de la norme (mode NI), dont la caractéristique principale est de ne pas prendre en charge les nombres dénormalisé.

Table des matières

1 Virgule Flottante
1.1 La norme sur la virgule flottante
1.1.1 Genèse de la norme IEEE-754
1.1.2 Quelques valeurs caractéristiques
1.1.3 Définitions et propriétés sur les nombres flottants
1.1.4 Problèmes et limites de la norme
1.2 Le dilemme du fabricant de tables
1.3 Vers une normalisation des fonctions mathématiques
1.3.1 Propriétés souhaitables
1.3.2 Les fonctions considérées
1.3.3 Choix des critères de qualités
1.3.4 Les trois niveaux d’arrondi proposés
1.3.5 Les exceptions
1.3.6 Interactions avec les autres normes
1.4 Conclusion
2 Évaluation des fonctions élémentaires
2.1 Évaluation matérielle
2.1.1 État de l’art
2.1.2 Une méthode à base de table avec de petits multiplieurs
2.2 Évaluation logicielle
2.2.1 Réduction d’argument
2.2.2 Approximation polynomiale
3 Optimisations appliquées aux fonctions élémentaires
3.1 Architecture des processeurs
3.1.1 Unités arithmétiques et flottantes
3.1.2 Mémoire
3.1.3 Conséquences au niveau logiciel
3.2 Opérations exactes sur les flottants
3.2.1 Codage d’un flottant double précision
3.2.2 L’addition exacte
3.2.3 La multiplication exacte
3.2.4 Conversions d’un flottant vers un entier
3.3 Test de l’arrondi
3.3.1 Arrondi au plus près
3.3.2 Arrondi vers +1
3.3.3 Arrondi vers

projet fin d'etudeTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

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