Maison > développement back-end > C++ > le corps du texte

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
Libérer: 2024-10-31 08:02:29
original
319 Les gens l'ont consulté

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
Copier après la connexion

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--;
}
Copier après la connexion

Nous ajoutons ensuite d1.low et d2.low à result.low :

result.low += d1.low + d2.low
Copier après la connexion

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--;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!