2 Stimmen

Wie sollte ich einen Gleichheitstest für 80bit IEEE Gleitkomma durchführen?

Verwandt mit:

Jedoch in Bezug auf 80-Bit-IEEE-Gleitkommazahlen (siehe Abschnitt 8.2) auf einem x86

Besonders gut gefällt mir die diese Implementierung unter Verwendung einer Zählung der darstellbaren Werte zwischen den Operanden, da diese standardmäßig skaliert.

Ein Anwendungsfall wären numerische Näherungen, bei denen sich zwei Werte einander annähern und ich prüfen muss, ob sie nahe genug beieinander liegen.


p.s. Die Sprache der Umsetzung wird D sein, aber ich kann übersetzen. Auch eine Implementierung, die automatisch behandeln kann, was auch immer der zugrunde liegende Typ ist (zum Beispiel wenn nur 64bit real verfügbar war) wäre ideal.

Der aktuell verwendete Code:

0 Stimmen

"I'm wrapping FPs in a units type" (siehe meine Antwort unten, die ich hier eingefügt habe, damit sie auf dem BCS-Radar erscheint) klingt nach D. Sicherlich müssen Sie irgendwann wissen, was der Datentyp für den Vergleich ist (d.h. es auspacken?).

0 Stimmen

[OT] @Pax: Das ist doch mal eine schöne Lösung!!!

0 Stimmen

2voto

paxdiablo Punkte 809679

Da D 80-Bit-Reale eingebaut hat (soweit ich das beurteilen kann), warum sollten Sie nicht einfach den Standardansatz des Vergleichs mit einem Epsilon-Wert verwenden. Dies kann ein fester Wert sein, wenn Sie den groben Bereich im Voraus kennen, wie bei der US-Währung:

if (abs (a - b) < 1e-6) // effectively equal

oder ein akzeptabler relativer Fehler, z. B. 1 Teil pro Million vom Durchschnitt:

if (abs (a - b) < ((a + b) / 2) / 1e6) // effectively equal

Bedenken Sie, dass ich D nicht kenne und der obige Code nur zu Demonstrationszwecken dient.

0 Stimmen

In meinem Fall verpacke ich FPs in einen Einheitstyp, so dass ich buchstäblich keine besonderen Kenntnisse über den Wertebereich habe.

0 Stimmen

Re Ihr Kommentar oben: siehe den neuen Link. Das Ganze ist eine D-Reduktion von Boost::SI

0voto

BCS Punkte 71108

Meine derzeitige Lösung ist

bool Near(real a, real b, int count = 5)
{
    // Returns the number of mantissa bits which are equal in x and y.
    int i = std.math.feqrel!(real)(a,b);
    return i + count >= real.mant_dig;
}

Sie gibt die Anzahl der nicht übereinstimmenden Bits in den Eingängen an. Ich bin nicht sicher, wie gut dies in der Nähe von Potenzen von 2 funktionieren wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X