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 ?

Comment l'addition double précision peut-elle être émulée à l'aide de flotteurs simple précision dans les systèmes embarqués ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 08:02:29390parcourir

How can double-precision addition be emulated using single-precision floats in embedded systems?

É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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn