Heim > Backend-Entwicklung > C++ > Hauptteil

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

Patricia Arquette
Freigeben: 2024-10-31 08:02:29
Original
381 Leute haben es durchsucht

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
Nach dem Login kopieren

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--;
}
Nach dem Login kopieren

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

result.low += d1.low + d2.low
Nach dem Login kopieren

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--;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage