70 votes

Emuler un "double" en utilisant 2 "float".

J'écris un programme pour un matériel embarqué qui ne supporte que l'arithmétique à virgule flottante 32 bits à simple précision. L'algorithme que j'implémente, cependant, nécessite une addition et une comparaison en double précision 64 bits. J'essaie d'émuler double en utilisant un tuple de deux float s. Donc un double d sera émulé comme un struct contenant le tuple : (float d.hi, float d.low) .

La comparaison devrait être simple en utilisant un ordre lexicographique. L'addition, en revanche, est un peu délicate, car je ne suis pas sûr de la base à utiliser. Devrais-je utiliser FLT_MAX ? Et comment puis-je détecter un portage ?

Comment cela peut-il être fait ?


Editer (Clarté) : J'ai besoin des chiffres significatifs supplémentaires plutôt que de l'étendue supplémentaire.

3voto

Lưu Vĩnh Phúc Points 3183

Ceci est similaire à la arithmétique double-double utilisé par de nombreux compilateurs pour long double sur certaines machines qui n'ont que du matériel double support de calcul. Il est également utilisé comme float-float sur les anciens GPU NVIDIA où il n'y a pas de support de calcul. double soutien. Voir Émulation de FP64 avec 2 FP32 sur un GPU . De cette façon, le calcul sera beaucoup plus rapide qu'avec une bibliothèque logicielle à virgule flottante.

Cependant, dans la plupart des microcontrôleurs, il n'y a pas de support matériel pour la fonction float de sorte qu'ils sont mis en œuvre uniquement par logiciel. De ce fait, l'utilisation de float-float mai pas augmente les performances et introduit une certaine surcharge de mémoire pour sauvegarder les octets supplémentaires de l'exposant.

Si vous avez vraiment besoin d'une mantisse plus longue, essayez d'utiliser une bibliothèque personnalisée à virgule flottante. Vous pouvez choisir ce qui vous convient, par exemple modifier la bibliothèque pour adapter un nouveau type de flottant 48 bits de votre choix si seulement 40 bits de mantisse et 7 bits d'exposant sont nécessaires. Plus besoin de passer du temps à calculer/stocker les 16 bits inutiles. Mais cette bibliothèque doit être très efficace car les bibliothèques des compilateurs ont souvent une optimisation au niveau de l'assemblage pour leur propre type de flottant.

2voto

phkahler Points 4008

Ce n'est pas pratique. Si c'était le cas, chaque processeur 32 bits embarqué (ou compilateur) émulerait la double précision en faisant cela. En l'état actuel des choses, aucun ne le fait à ma connaissance. La plupart d'entre eux se contentent de substituer float pour double .

Si vous avez besoin de la précision et non de la plage dynamique, votre meilleure chance est d'utiliser la virgule fixe. Si le compilateur supporte le 64 bits, ce sera également plus facile.

2voto

Ioan Points 1719

Une autre solution logicielle qui pourrait vous être utile : GNU MPFR
Il prend en charge de nombreux autres cas spéciaux et permet une précision arbitraire (meilleure que le double 64 bits) que vous devriez autrement prendre en charge vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X