Heim >Backend-Entwicklung >C++ >Wie kann die Addition mit doppelter Genauigkeit mithilfe von Gleitkommazahlen mit einfacher Genauigkeit in eingebetteten Systemen emuliert werden?
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!