float/double Gleichstellung mit genau null

Habe ich einen Algorithmus, der verwendet floats oder doubles um einige Berechnungen auszuführen.

Beispiel:

double a;
double b;
double c;
...
double result = c / (b - a);
if ((result > 0) && (result < small_number))
{
    //result is relevant...
} else {
    //result not required...
}

Nun, ich bin besorgt über (b - a) auch null sein kann. Wenn es ist nahe null, aber nicht gleich null ist, es spielt keine Rolle, weil die result werden außerhalb der Reichweite ist, um nützlich zu sein, und ich auch schon feststellen, dass (wie (b - a) null nähert, result Ansatz +/- inf, die nicht in den Bereich 0-small_number...)

Aber wenn das Ergebnis (b - a) genau null, ich erwarte, dass etwas Plattform abhängig wird passieren, wegen Division durch null. Ändern könnte ich die if Anweisung:

if ((!((b-a) == 0.0)) && ((result = c/(b-a)) > 0) && (result < small_number)) {

aber ich weiß nicht, ob (b-a) == 0.0 wird immer erkennen, dass Gleichheit mit null. Ich habe gesehen, es gibt mehrere Darstellungen für exakte null-floating-point? Wie können Sie testen für Sie alle, ohne dabei einige epsilon überprüfen, die ich nicht brauchen (ein kleines epsilon ignoriert werden in meinem Algorithmus)?

Was ist die Plattform-unabhängige Art und Weise zu überprüfen?

EDIT:

Nicht sicher, ob es war deutlich genug zu den Menschen. Im Grunde möchte ich wissen, wie zu finden, wenn ein Ausdruck wie:

double result = numerator / denominator;

Ergebnis wird in eine Fließkomma-Ausnahme, eine cpu-exception, ein signal vom Betriebssystem oder etwas anderes.... ohne tatsächlich die Durchführung der Betriebs-und sehen, ob es "werfen"..., weil das erkennen einer "throw" dieser Art scheint zu sein, kompliziert und Plattform-spezifische.

Ist ( (denominator==0.0) || (denominator==-0.0) ) ? "Will 'throw'" : "Won't 'throw'"; genug?

  • Auch wenn b - a ist nicht genau null ist, wird der Betrieb c / (b - a) könnte noch überlaufen und senden Sie den Wert auf +/-INF.
  • Das ist in Ordnung, man sollte das Ergebnis außerhalb des Bereichs von Interesse für mein problem.
  • Es ist schwer zu finden, eine Umsetzung, die nicht IEEE-floating-point. Also ich denke, es ist sicher anzunehmen, dass die division durch 0 einfach Ertrag +INF oder -INF? Jemand korrigiert mich wenn ich falsch bin?
  • Hängt davon ab, was der Zähler ist. Offenbar 0.0 / 0.0 ist "NaN", und löst eine andere FP Ausnahme bei Ausnahmen aktiviert sind.
  • Ah, guter Punkt. Ich glaube nicht, dass - vor allem die 0.0 / 0.0 Fall.
  • BTW, Mystische teilweise richtig ist. gcc wird einfach ein segmentation fault, das ist (glaube ich) eine un-abfangbare Ausnahme. Auf jeden Fall eine Division durch null darf nie eine Ausnahme gefangen. Ich denke, das ist eine gute Frage und meiner Meinung nach, jede person schriftlich eine division operator sollten Sie immer prüfen, für null unabhängig von der code
  • Versuchen Neuordnung der Zustand so, dass Sie die Division durch small_number statt b-a.

InformationsquelleAutor Bingo | 2012-03-03
Schreibe einen Kommentar