Im Rahmen der statischen Analyse bin ich daran interessiert, die Werte von x
im Dann-Zweig der Bedingung zu bestimmen unten:Schnellster Algorithmus zur Identifizierung des kleinsten und größten x, der die Doppelpräzisionsgleichung x + a == b true
double x;
x = …;
if (x + a == b)
{
…
a
und b
kann mit doppelter Genauigkeit Konstanten sein (verallgemeinernd auf beliebige Ausdrücke ist der einfachste Teil des Problems), und die Compiler IEEE 754 streng folgen kann angenommen werden, davon ausgegangen werden (FLT_EVAL_METHOD
0). Der Rundungsmodus zur Laufzeit kann als nächster-gerade angenommen werden.
Wenn die Berechnung mit Rationals billig wäre, wäre es einfach: Die Werte für x
wären die Zahlen mit doppelter Genauigkeit im rationalen Intervall (b - a - 0,5 * ulp1 (b) ... b - a + 0,5 * ulp2 (b)). Die Grenzen sollten enthalten sein, wenn b
gerade ist, ausgeschlossen, wenn b
ungerade ist, und ulp1 und ulp2 sind zwei leicht unterschiedliche Definitionen von "ULP", die identisch genommen werden können, wenn es einem nichts ausmacht, ein wenig Genauigkeit bei Zweierpotenzen zu verlieren.
Leider kann die Berechnung mit Rationals teuer sein. Betrachten Sie, dass eine andere Möglichkeit darin besteht, jede der Grenzen durch Dichotomie in 64 Additionen mit doppelter Genauigkeit zu erhalten (jede Operation entscheidet über ein Bit des Ergebnisses). 128 Gleitkomma-Additionen, um die untere und obere Grenze zu erhalten, können durchaus schneller sein als jede mathematische Lösung.
Ich frage mich, ob es eine Möglichkeit gibt, über die "128 Gleitkomma-Ergänzungen" Idee zu verbessern. Eigentlich habe ich meine eigene Lösung mit Änderungen des Rundungsmodus und nextafter
Anrufe, aber ich würde niemanden Stil zu krampfen und ihnen eine elegantere Lösung verpassen wollen als die, die ich derzeit habe. Ich bin mir auch nicht sicher, ob das zweimalige Ändern des Rundungsmodus tatsächlich billiger ist als 64 Gleitkomma-Additionen.
Könnten Sie die binäre Suche verwenden, um die Werte zu halbieren, die Sie wollen? Es scheint, dass dies möglich sein sollte, da die Anzahl der Bits niedrig ist. – templatetypedef
@templatetypedef die "128 Gleitkomma-Ergänzungen" Lösung, die ich skizziere, ist eine binäre Suche über die Darstellung von Fließkommazahlen, und die, die ich nicht zeigen will, weil ich nicht weiß, ob es tatsächlich ein ist Die Verbesserung reduziert das anfängliche Intervall zur Halbierung, indem ein übermäßig angenäherter Bereich von Kandidaten berechnet wird, der dann durch binäre Suche verfeinert werden müsste. –
@templatetypedef Ich hoffe, dass jemand mit einem Satz von Fließkomma-Arithmetik auftaucht, der das Problem eleganter löst. –