Ich lese diese in einem populären Buch über Computergrafik,Skipping „Test für Null“ checks in IEEE 754
Es gibt viele numerische Berechnungen, die viel einfacher geworden, wenn der Programmierer die Vorteile der IEEE-Regeln erfolgt. Betrachten wir zum Beispiel den Ausdruck:
a = 1/(1/b + 1/c)
Solche Ausdrücke mit Widerständen und Linsen auftreten. Wenn Dividieren durch Null zu einem Programmabsturz führte (wie es in vielen Systemen vor dem Gleitkomma-IEEE der Fall war), dann wären zwei if-Anweisungen erforderlich, um nach kleinen oder Nullwerten von b oder c zu suchen. Bei einem IEEE-Fließkommawert erhalten wir, wenn b oder c Null ist, nach Bedarf einen Nullwert für a.
Aber was ist mit dem Fall, wo b=+0
und c=-0
? Dann a=1/inf-inf=nan
. Ist das Buch falsch über diese Optimierungen oder habe ich etwas falsch verstanden? Es scheint, als ob wir immer noch mindestens einen Scheck für die Zeichen von b & c benötigen, anstatt überhaupt keine Schecks.
Bearbeiten Ein Vorschlag in den Kommentaren war nur eine Nachprüfung für NaN. Ist das der idiomatische Weg, diesen Zahlentyp "auszunutzen"?
bool is_nan(float x) { return x != x; }
float optic_thing(float b, float c) {
float result = 1.0f/(1.0f/b + 1.0f/c);
if (is_nan(result)) result = 0;
return result;
}
Wäre nicht eine einfache Nachprüfung für NaN ausreichend? – bipll
Wahrscheinlich vermisse ich etwas, aber es ist unklar, warum die obige Aussage wahr wäre. Wenn entweder b oder c Null ist, wird dieser Ausdruck 1/unendlich, was nicht Null ist. –
Sie müssten * drei * Checks von 0 für Ihren Ausdruck benötigen, wenn 'b' oder' c' negativ sein können. Denn '1/b + 1/c' wird' 0' wenn 'b == -c' –