Seite 1 von 1
Division durch 0 verboten.
Verfasst: 17.11.2017 21:24
von NicTheQuick
Hi Leute,
eigentlich sollte man bei Fließkommazahlen doch durch 0 teilen können. Dann kommt je nachdem entweder + oder - unendlich raus. Ich hatte auch das Gefühl, dass das mal funktioniert hatte. Wieso geht das jetzt nicht mehr? Oder ging es doch noch nie?
Außerdem gibt es ja noch den speziellen Wert NaN, zum Beispiel wenn man die Wurzel aus einer negativen Zahl zieht. Das funktioniert auch problemlos.
Übrigens bekommt man +Infinity raus, wenn man einfach nur oft genug eine Zahl multipliziert. Das funktioniert also schon.
Re: Division durch 0 verboten.
Verfasst: 17.11.2017 21:41
von mk-soft
Gerade getestet mit PB v3.94... Nö
ging noch nie, fast...
Damals
Code: Alles auswählen
OnErrorResume()
a = 10
b = 0
c = a / b
MessageRequester("Test", "Result " + Str(c))
Re: Division durch 0 verboten.
Verfasst: 17.11.2017 22:45
von Nino
NicTheQuick hat geschrieben:eigentlich sollte man bei Fließkommazahlen doch durch 0 teilen können. Dann kommt je nachdem entweder + oder - unendlich raus.
Bei einer Division durch 0 ist das Ergebnis leider nicht auf + oder - unendlich festgelegt.
Wikipedia hat geschrieben:Für beliebige Zahlenmengen ist die Division als Umkehrung der Multiplikation definiert. Bei der Division von b durch a sucht man eine Zahl x, welche die Gleichung a ⋅ x = b erfüllt. Diese Zahl x – sofern sie eindeutig bestimmt ist – schreibt man als Quotienten x = b / a.
Im besonderen Fall, dass a = 0 ist, gibt es kein
eindeutiges Ergebnis: Wir suchen eine Lösung der Gleichung 0 ⋅ x = b.
- Im Fall b ≠ 0 ist die Gleichung unlösbar, weil es keine Zahl x gibt, für die 0 ⋅ x ≠ 0 gilt.
- Im Fall b = 0 wird die Frage, welche Zahl x die Gleichung erfüllt, trivial:
Jede Zahl x erfüllt die Gleichung 0 ⋅ x = 0.
Also gibt es in beiden Fällen kein
eindeutiges Ergebnis bei der Division durch null.
Beim Rechnen mit reellen (oder komplexen) Zahlen ist es also nicht möglich, durch null zu dividieren, da diese Operation kein eindeutiges Ergebnis hätte: Die Multiplikation mit 0 ist nicht umkehrbar.
Re: Division durch 0 verboten.
Verfasst: 17.11.2017 22:59
von NicTheQuick
@Nino
Es geht aber nicht um die reellen Zahlen, sondern um Fließkommazahlen. In
IEEE 754 ist festgelegt, dass die Division durch 0 in plus oder minus Unendlich resultiert. Das sollte eigentlich auch Purebasic beherzigen. In allen oder zumindest in allen mir bekannten Programmiersprachen ist dieses Verhalten auch zu finden. Und es ergibt in vielen Bereich auch Sinn und man kann es ja abfangen, wenn das Ergebnis tatsächlich unendlich wird.
Zum Beispiel kann ATan() mit Unendlich umgehen und gibt korrekt #PI / 2 aus:
Code: Alles auswählen
d.d = 1.0
For i = 1 To 309
d * 10.0
Next
Debug d
Debug ATan(d) * 2 ;mal 2, damit Pi erkennen kann
Re: Division durch 0 verboten.
Verfasst: 17.11.2017 23:06
von STARGÅTE
Naja im Falle von Fließkommazahlen ist das ganze noch etwas differenzierter, da es ja eine +0 und eine -0 gibt.
Hier mal eine Tabelle aller möglichen Resultate bei einer Float-Division:
http://x86.renejeschke.de/html/file_mod ... id_91.html
Hier im übrigen einer Variante ohne meckern:
Code: Alles auswählen
Procedure.f Float(f.f)
ProcedureReturn f
EndProcedure
Debug Float(1.0) / 0.0
Debug Float(-1.0) / 0.0
Im übrigen kann PB ohne weiteres durch 0 dividieren (ohne Debugger)
Re: Division durch 0 verboten.
Verfasst: 17.11.2017 23:15
von Nino
NicTheQuick hat geschrieben:@Nino
Es geht aber nicht um die reellen Zahlen, sondern um Fließkommazahlen. In
IEEE 754 ist festgelegt, dass die Division durch 0 in plus oder minus Unendlich resultiert.
OK, das wusste ich nicht. Allerdings hatte ich schon sowas vermutet.

Für mich ist und bleibt das aber primär eine mathematische Frage.
NicTheQuick hat geschrieben:Und es ergibt in vielen Bereich auch Sinn
Es ist in der Mathematik normal, dass man Ausdrücken, die nicht allgemein definiert sind,
in bestimmten Zusammenhängen bestimmte Werte zuweist, weil diese Werte genau in diesen Zusammenhängen sinnvoll sind.
Das heißt aber nicht, dass ganz allgemeingültig immer x / 0 = unendlich ist
(in dem Sinne wie z.B. allgemeingültig immer 6 / 2 = 3 ist).
Re: Division durch 0 verboten.
Verfasst: 18.11.2017 00:04
von NicTheQuick
@Nino
Ja, natürlich nicht. Mathematisch sehe ich das natürlich ein.
Nur bei Fließkommazahlen hätte ich gerne diese doch recht praktische Eigenschaft. Es geht da ja in erster Linie auch darum, dass ein Programm wegen sowas nicht abstürzt.
@Stargate:
Dass es ohne Debugger funktioniert, habe ich nicht bedacht.

Dann ist das wohl wirklich nur ein Problem vom Debugger. Diese Meldung sollte man ausschalten können.
Re: Division durch 0 verboten.
Verfasst: 10.01.2018 20:42
von Beefi
Durch 0 kann man nicht teilen, auch nicht mit Fließkommazahlen...und es gibt in der Mathematik auch keine Ausnahme.
Es gibt aber eine Methode in der Mathematik, wie sich das Ergebnis bei "annähernd" Null verhalten würde.
Dazu setzt man den "Limes gegen 0". Und hier gibt es dann auch 0+ und 0-, was aber beschreibt, von welcher Richtung man sich der Null annähert.
Beispiel: (5 / X)
Limes -> 0+ = "unendlich"
Limes -> 0- = "minus unendlich"
Normalerweise verwendet man den Limes jedoch bei aufwendigeren Polynomen. Und als Testwert kann man z.B. eingegeben 0,00001 oder -0,000000001. Und der Limes muss nicht immer gegen 0 gehen, sondern kann gegen beliebige Zahlen gesetzt werden.
Um zu verhindern, dass das Programm wegen einer Teilung durch 0 nicht abstürzt, könntest du eine Abfrage setzen, dass die Rechnung auch nur durchgeführt wird, wenn X <> 0 ist.
Re: Division durch 0 verboten.
Verfasst: 10.01.2018 21:02
von NicTheQuick
Ja, das weiß ich alles.

Trotzdem geht es hier nicht um die Regeln der Mathematik, sondern um die Regeln von Fließkommazahlen, wie sie von IEEE 754 festgelegt werden. Und da kann man durch Null teilen. Es gibt bei Fließkommazahlen sogar +0 und -0. Wollt ihr jetzt noch darüber diskutieren, dass das auch nicht sein darf?
Rechnet man mit Vektoren in 3D-Szenzen kann man auch nicht dauernd überprüfen, ob ein Wert 0 ist, wenn man etwas ausrechnen will. Hier kommt das sehr gelegen, wenn Unendlich raus kommt, da man dann immer noch damit weiter rechnen kann. Wie zum Beispiel in meinem Beispiel mit dem Arcustangens.