Wodurch kann es in einem Programm zum Fehler ,,Gleitkommadivision durch 0" kommen?

6 Antworten

Dadurch, dass 0.0 als Nenner auftritt und die FPU so eingestellt ist, dann eine Exception auszulösen anstatt +unendlich, -unendlich oder NaN zurückzugeben. (Vgl. https://de.wikipedia.org/wiki/IEEE_754)

Meistens ist es sinnvoller, eine Ausnahme auszulösen statt mit diesen besonderen Werten weiterzurechnen - üblicherweise ist der weitere Algorithmus nicht für diese Werte ausgelegt, und wenn man auf eine Situation stößt, mit der man nicht sinnvoll umgehen kann, ist es generell empfehlenswert, möglichst früh mit einer Fehlermeldung abzubrechen ("fail early and loudly").

Letztlich muss man den Original-Quelltext untersuchen, an welcher Stelle entweder nicht sichergestellt wird, dass der Nenner niemals 0 ist, oder versäumt wurde, mit dieser Situation umzugehen. Oder - in seltenen Fällen - nachzusehen, ob a) sichergestellt ist, dass mit Unendlichkeiten und NaN sinnvoll umgegangen wird, und b) wo versäumt wurde, entsprechende Ausnahmen zu deaktivieren.

Indem man dort eine Division durch 0 drin hat. Das ist in unserer Mathematik unmöglich und jeder halbwegs aktive Programmierer stellt sicher, dass es nicht dazu kommt.

Was in der Praxis manchmal auftritt: Jemand hat eine Software und installiert eine Modifikation dazu, die nach Aktualisierung der Software veraltet (beispielsweise keine passenden Schnittstellen mehr benutzt) und der Modprogrammierer ist zu blöd gewesen oder es war ihm egal, diesen Fall zu beachten.

Der Name des Fehlers sagt doch bereits alles aus. Der Fehler tritt auf, wenn man eine Kommazahl (Computer benutzen da sogenannte "Gleitkommazahlen") durch Null teilt (Teilen = Division).

Beispiel:

1.0 / 0
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
Muster1 
Fragesteller
 30.09.2022, 12:26

Was das ist habe ich wohl verstanden aber es muss ja eine Ursache dafür geben. Irgendwo muss das Programm dann ja fehlerhaft sein.

0
MrAmazing2  30.09.2022, 12:28
@Muster1

Jo, der Fehler ist, dass du eine Null als Teiler zulässt. Das musst du verhindern, dass jemals eine Null im Teiler stehen könnte. Kenne dein Programm leider nicht, sonst könnt ich dir genaueres sagen.

Aber so kannst du z.B. eine 0 abfangen und durch eine 1 austauschen. Ganz nützlich wenn man Beispielsweise eine KD berechnen will und Kills durch Tode teilt.

ergebnis = nenner / (teiler == 0 ? 1 : teiler);
1
priesterlein  30.09.2022, 13:11
@Muster1

Du musst bei solchem Wissensdurst aber auch selber darauf kommen, dass es hilfreich sein kann, zu wissen, um welches Programm es sich handelt und in welcher Situation das auftritt.

2
Muster1 
Fragesteller
 30.09.2022, 14:06
@priesterlein

Naja ich dachte das wäre überall ähnlich. Genau genommen handelt es sich um Omsi2, das wohl fehlerbehaftetste und instabilste Spiel (Simulator) der Welt. Der Fehler tritt derzeit direkt beim Starten auf.

0
priesterlein  30.09.2022, 15:07
@Muster1

Und Mods installiert, beispielsweise Grafikverbesserungen? Dann mal deaktivieren.

2

Ursache ist immer ein Programmierfehler.

Ihn zu finden, kann durchaus einige Arbeit erfordern (und zwar ganz unterschiedlich viel Arbeit, je nachdem, wie dein Programm durch dich gestaltet wurde, mit dem Ziel, die Ursache von Fehlern – nicht nur solcher Art – schnell lokalisieren zu können).

Wenn der Nenner eines Bruches a/b beim Dividieren gerade Null ist, muss ja schließlich die Frage geklärt werden, an welcher Stelle im Programm b den Wert Null bekam (und auch weswegen).

Dadurch, dass die FPU, also die Gleitkommarecheneinheit im Prozessor, gefragt wurde, eine Division durch Null auszuführen, und die daraufhin mittels einer Exception mitteilt, dass die nicht weiß, wie so etwas geht.