Maison >développement back-end >C++ >Comment l'addition double précision peut-elle être émulée à l'aide de flotteurs simple précision dans les systèmes embarqués ?
Émulation de l'arithmétique double précision avec des flotteurs simple précision
Dans le domaine des systèmes embarqués avec des capacités limitées en virgule flottante, le besoin s'en fait sentir pour émuler des structures de données en double précision en utilisant des structures de données en simple précision. Cet article aborde le défi de la mise en œuvre d'opérations d'addition et de comparaison en double précision à l'aide de paires de flotteurs simple précision.
Comparaison
Comparer deux valeurs doubles émulées est une affaire simple . Nous utilisons un ordre lexicographique, en comparant les éléments du tuple de manière séquentielle. (d1.hi > d2.hi) OU ((d1.hi == d2.hi) AND (d1.low > d2.low))
Ajout
L'émulation d'une addition double précision s'avère plus délicate. Nous devons déterminer une base à utiliser et une méthode pour détecter les carrys.
Sélection de base
FLT_MAX est une base inadaptée car elle introduit des problèmes de débordement et de sous-débordement indésirables. Au lieu de cela, nous adoptons un format à virgule flottante avec une plage d'exposants plus large mais une précision réduite, appelé « double flotteur ».
Carry Detection
Soit d1 et d2 sont les deux valeurs doubles émulées à ajouter. Nous additionnons d'abord d1.hi et d2.hi :
result.hi = d1.hi + d2.hi
Si result.hi déborde, nous savons qu'il y a un report. Dans ce cas, nous décrémentons result.hi de 1 et ajoutons 1 à result.low. Si result.hi dépasse les limites, nous l'incrémentons de 1 et soustrayons 1 de result.low.
if (result.hi overflowed) { result.hi--; result.low++; } else if (result.hi underflowed) { result.hi++; result.low--; }
Nous ajoutons ensuite d1.low et d2.low à result.low :
result.low += d1.low + d2.low
Si result.low déborde, on incrémente result.hi de 1. S'il sous-déborde, on décrémente result.hi de 1.
if (result.low overflowed) { result.hi++; } else if (result.low underflowed) { result.hi--; }
Enfin, on renvoie le double résultat émulé avec (result.hi , result.low).
Cette méthodologie, basée sur les travaux de Dekker et Kahan, nous permet d'émuler l'addition en double précision avec une précision et une efficacité raisonnables dans un environnement contraint à l'arithmétique simple précision.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!