ErnstVolker hat geschrieben:Meine Frage ist wie man "sinnvoll" mit einer Nulldivision umgeht. Manche Programme geben NaN für "Not a Number" oder Inf für Infinity für unendlich aus. Kann das Lazarus auch bzw. Wie rechnet man damit weiter?
Einfach nur mit Exception aus der Rechnung aussteigen ist auch blöd.
Sucht man den Nullwert und seine Benachbarten Werte also Stelle "i" und dann "i-1" sowie "i+1" und mittelt einach zwischen den Werten und schreibt den Mittelwert anstelle der Null an die Position "i" ?
Was ist in solchen Fällen mathematisch/technisch richtig?
Kommt drauf an...
Zunächst musst du dir das Problem nochmals ansehen. Bei dir werden die Koeffizienten einer Transformation bestimmt. Normalerweise funktioniert das, aber wenn die Referenzpunkte schlecht/falsch gewählt sind, könnte ich mir vorstellen, dass das zugehörige Gleichungssystem nicht lösbar ist. Die NumLib-Routinen geben im lezten Parameter "term" einen Fehlercode aus. Wenn "term" <> 1 ist, brauchst du gar nicht weiterzurechnen. Wenn du's doch tust, passiert vielleicht gar nichts, schlimmstenfalls gibt es vielleicht nur etwas seltsam aussehende Bilder. Oder aber halt doch einen Gleitkomma-Absturz, oder eine Division durch null. Letzteres darfst du auf keinen Fall dadurch lösen, indem du eine kleine Zahl zum Nenner addierst und so die Division durch Null vermeidest. Dadurch wird das Problem verschleiert, das Programm läuft, enthält aber einen verborgenen Fehler, der später, mit Sicherheit beim Kunden, auftreten wird. Ohne die Exception ist es viel schwerer, den Fehler zu finden.
Es sollte auch noch erwähnt werden, dass die Division durch Null oft behoben werden kann, wenn auch der Zähler Null ist. Also: 0/0 kann durchaus einen sinnvollen Wert haben. Bekanntes Beispiel: sin(x)/x hat für x=0 den Wert 1 (weil sin(x) für ganz kleine x ungefähr gleich x ist, wodurch sich das x herauskürzt). Eine Funktion, die sin(x)/x berechnet, muss daher x auf Null prüfen und in diesem fall den Funktionswert 1 übergeben.
Wenn bei allgemein gelagerten Problemen eine Division durch Null durchaus möglich ist (z.B. bei einem Funktionsparser, bei dem der User einen Funktionsausdruck eingeben und berechnen kann), dann kannst du das ganze in einen try-except Block packen, die Exception abfangen und einen "schönen" Fehlermeldungstext anzeigen - genau dafür sind die Dinger gemacht.
Andererseits stört mich bei Exceptions, dass die Arbeit in der IDE durch die Exception unterbrochen wird (gut - das kann man wiederum ausschalten, aber nur für bekannte Exception-Typen). Daher ersetze ich den Funktionswert in diesem Fall häufig durch NaN, denn das signalisiert "keine Zahl", d.h. kein Ergebnis. Außerdem kann man mit NaN nicht mehr rechnen. Also: wenn für x der Wert NaN herauskommt, dann ist ein Weiterrechnen wie x+1 nicht mehr möglich, selbst ein "if x = 1 then" geht nicht mehr - denn es wird wieder eine Exception geworfen, so dass dir weiterhin angezeigt wird, dass etwa faul ist. Nur wenn du ganz sicher bist, dass alles mit rechten Dingen zugeht, kannst du mit "if IsNaN(x) then" prüfen und ggfs wieder eine Fehlermeldung anzeigen.
Inf finde ich nicht so gut, denn es gibt zwei Fälle, +Inf oder -Inf, je nachdem ob du eine positive oder negative Zahl durch Null dividierst. Das erscheint mir zu komplex als Fehlerwert.