Heim >Backend-Entwicklung >C++ >Wie kann die Addition mit doppelter Genauigkeit mithilfe von Gleitkommazahlen mit einfacher Genauigkeit in eingebetteten Systemen emuliert werden?

Wie kann die Addition mit doppelter Genauigkeit mithilfe von Gleitkommazahlen mit einfacher Genauigkeit in eingebetteten Systemen emuliert werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 08:02:29390Durchsuche

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

Emulierung von Arithmetik mit doppelter Genauigkeit und Gleitkommazahlen mit einfacher Genauigkeit

Im Bereich eingebetteter Systeme mit begrenzten Gleitkommafunktionen besteht ein Bedarf um Datenstrukturen mit doppelter Genauigkeit mithilfe von Datenstrukturen mit einfacher Genauigkeit zu emulieren. Dieser Artikel befasst sich mit der Herausforderung, Additions- und Vergleichsoperationen mit doppelter Genauigkeit mithilfe von Gleitkommapaaren mit einfacher Genauigkeit zu implementieren.

Vergleich

Der Vergleich zweier emulierter Doppelwerte ist eine unkomplizierte Angelegenheit . Wir verwenden eine lexikografische Reihenfolge und vergleichen die Tupelelemente nacheinander. (d1.hi > d2.hi) ODER ((d1.hi == d2.hi) UND (d1.low > d2.low))

Addition

Das Emulieren der Addition mit doppelter Genauigkeit erweist sich als schwieriger. Wir müssen eine zu verwendende Basis und eine Methode zur Erkennung von Überträgen festlegen.

Basisauswahl

FLT_MAX ist eine ungeeignete Basis, da sie unerwünschte Überlauf- und Unterlaufprobleme mit sich bringt. Stattdessen verwenden wir ein Gleitkommaformat mit einem größeren Exponentenbereich, aber geringerer Genauigkeit, das als „Double-Float“ bezeichnet wird.

Übertragserkennung

Sei d1 und d2 seien die beiden emulierten Double-Werte, die addiert werden sollen. Zuerst summieren wir d1.hi und d2.hi:

result.hi = d1.hi + d2.hi

Wenn result.hi überläuft, wissen wir, dass ein Übertrag vorliegt. In diesem Fall dekrementieren wir result.hi um 1 und addieren 1 zu result.low. Wenn result.hi einen Unterlauf aufweist, erhöhen wir es um 1 und subtrahieren 1 von result.low.

if (result.hi overflowed)
{
    result.hi--;
    result.low++;
}
else if (result.hi underflowed)
{
    result.hi++;
    result.low--;
}

Wir addieren dann d1.low und d2.low zu result.low:

result.low += d1.low + d2.low

Wenn result.low überläuft, erhöhen wir result.hi um 1. Wenn es unterläuft, dekrementieren wir result.hi um 1.

if (result.low overflowed)
{
    result.hi++;
}
else if (result.low underflowed)
{
    result.hi--;
}

Schließlich geben wir das emulierte Doppelergebnis mit (result.hi zurück , result.low).

Diese auf der Arbeit von Dekker und Kahan basierende Methodik ermöglicht es uns, die Addition mit doppelter Genauigkeit mit angemessener Genauigkeit und Effizienz in einer Umgebung zu emulieren, die auf Arithmetik mit einfacher Genauigkeit beschränkt ist.

Das obige ist der detaillierte Inhalt vonWie kann die Addition mit doppelter Genauigkeit mithilfe von Gleitkommazahlen mit einfacher Genauigkeit in eingebetteten Systemen emuliert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn