Quels sont les applications / avantages d'un type de données à précision étendue 80 bits?

StackOverflow https://stackoverflow.com/questions/612507

  •  03-07-2019
  •  | 
  •  

Question

Oui, je voulais dire 80 bits . Ce n'est pas une faute de frappe ...

Mon expérience des variables à virgule flottante a toujours impliqué des multiples de 4 octets, tels que singles (32 bits), doubles (64 bits) et longs doubles (que j'ai vus dénommés soit 96 bits, soit 128 bits). ). C’est pourquoi j’étais un peu perplexe lorsque je suis tombé sur un type de données à précision étendue 80 bits pendant que je travaillait sur du code à lire et à écrire dans les fichiers AIFF (Audio Interchange File Format) : un fichier étendu La variable de précision a été choisie pour stocker le taux d’échantillonnage de la piste audio.

En parcourant Wikipedia, j'ai trouvé le lien ci-dessus, ainsi qu'une brève mention des formats 80 bits dans Norme IEEE 754-1985 récapitulatif (mais pas dans le norme IEEE 754-2008

Une chose que je n'ai pas encore rencontrée concerne des applications spécifiques qui utilisent des types de données à précision étendue (à l'exception, bien entendu, des taux d'échantillonnage des fichiers AIFF). Cela m'a amené à me demander:

  • Quelqu'un at-il rencontré une situation dans laquelle une précision accrue était nécessaire / bénéfique pour certaines applications de programmation?
  • Quels sont les avantages d'un nombre à virgule flottante de 80 bits, mis à part l'évident "il s'agit d'un peu plus de précision qu'un double mais moins d'octets que la plupart des implémentations d'un long double"?
  • Son applicabilité diminue-t-elle?
Était-ce utile?

La solution

Les FPU d’Intel utilisent le format 80 bits en interne pour améliorer la précision des résultats intermédiaires.

C'est-à-dire que vous pouvez avoir des variables 32 bits ou 64 bits, mais lorsqu'elles sont chargées dans les registres FPU, elles sont converties en 80 bits. la FPU effectue alors (par défaut) tous les calculs dans 80 mais; après le calcul, le résultat est stocké dans des variables 32 bits ou 64 bits.

BTW - Une conséquence un peu fâcheuse de cela est que les versions de débogage et de version peuvent produire des résultats légèrement différents: dans la version de version, l'optimiseur peut conserver une variable intermédiaire dans un registre FPU de 80 bits, alors que dans la version de débogage sera stocké dans une variable de 64 bits, entraînant une perte de précision. Vous pouvez éviter cela en utilisant des variables 80 bits ou en utilisant un commutateur FPU (ou une option du compilateur) pour effectuer tous les calculs en 64 bits.

Autres conseils

Pour moi, l’utilisation de 80 bits est ESSENTIELLE. De cette façon, j'obtiens des valeurs propres d'ordre élevé (30 000) et des vecteurs propres de matrices symétriques avec quatre chiffres supplémentaires lorsque j'utilise la bibliothèque GOTO pour les produits internes de vecteurs, à savoir 13, au lieu de 9 chiffres significatifs pour le type de matrices que j'utilise dans l'atome relativiste. calculs, ce qui est nécessaire pour éviter de tomber dans la mer des états d’énergie négative. Mon autre option est d’utiliser une arithmétique en quadruple précision qui augmente le temps de calcul de 60 à 70 fois et augmente également les besoins en RAM. Tout calcul reposant sur des produits internes de grands vecteurs en bénéficiera. Bien entendu, pour conserver des résultats partiels de produits internes dans des registres, il est nécessaire d’utiliser un langage assembleur, comme dans les bibliothèques GOTO. C’est ainsi que j’ai aimé mes anciens processeurs Opteron 850, que j’utiliserai aussi longtemps qu’ils dureront pour cette partie de mes calculs.

La raison pour laquelle 80 bits sont rapides, alors qu’une précision supérieure est beaucoup plus lente, c’est que le matériel standard à virgule flottante de la CPU possède des registres de 80 bits. Par conséquent, si vous voulez les 16 bits supplémentaires (11 bits supplémentaires de mantisse, quatre bits supplémentaires d'exposant et un bit supplémentaire inutilisés), il ne vous en coûtera pas beaucoup d'étendre de 64 à 80 bits - alors que d'étendre au-delà de 80 bits est extrêmement coûteux en terme de temps d'exécution. Vous pouvez donc aussi bien utiliser la précision 80 bits si vous le souhaitez. Son utilisation n’est pas gratuite, mais son prix est relativement bas.

Wikipedia explique qu'un format 80 bits peut représenter un entier entier de 64 bits sans perdre information. Ainsi, l’unité à virgule flottante de la CPU peut être utilisée pour implémenter la multiplication et la division d’entiers.

Un autre avantage qui n’a pas encore été mentionné pour les types 80 bits réside dans le fait que les processeurs 16 bits ou 32 bits n’ont pas d’unités à virgule flottante, mais ont un paramètre "multiplier". instruction qui produit un résultat deux fois plus long que les opérandes (16x16 - 32 ou 32x32 - 64), l'arithmétique d'une mantisse de 64 bits subdivisée en quatre ou deux registres de 16 ou 32 bits sera plus rapide que l'arithmétique sur une mantisse de 53 bits qui couvre le même nombre de registres mais doit partager 12 bits de registre avec le signe et l'exposant. Pour les applications ne nécessitant rien de plus précis que float , les calculs sont effectués sur un "float étendu" 48 bits. Le type pourrait également être plus rapide que les calculs sur un float 32 bits.

Alors que certaines personnes pourraient regretter le double-arrondi des types à précision étendue, il ne s'agit en réalité que d'un problème dans les applications spécialisées nécessitant une reproductibilité multiplate-forme exacte. Du point de vue de la précision , la différence entre une erreur d’arrondi de 64/128 vs 65/128 ou de 1024/2048ulp vs 1025/2048 n’est pas un problème; dans les langues avec types de variables à précision étendue et sémantique à précision étendue cohérente , l’utilisation de types étendus sur de nombreuses plates-formes ne disposant pas de matériel à virgule flottante (systèmes intégrés, par exemple) précision et une meilleure vitesse que les types à virgule flottante simple ou double précision.

J'ai utilisé 80 bits pour des recherches en mathématiques pures. Je devais résumer les termes dans une série infinie assez large, en dehors de la gamme des doubles. La convergence et la précision ne sont pas un problème, mais la possibilité de gérer des exposants importants comme 1E1000. Une algèbre intelligente aurait peut-être pu simplifier les choses, mais il était bien plus simple et plus rapide de coder un algorithme avec une précision étendue que de passer du temps à y penser.

J'ai un ami qui travaille dans ce domaine. Il travaille sur une bibliothèque pour gérer des points flottants de la taille d'un gigaoctet. Bien sûr, quelque chose est lié au calcul scientifique (calculs avec plasma), et probablement seul ce type d’informatique fonctionne avec des nombres aussi gros que ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top