Division durch 0 verboten.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Division durch 0 verboten.

Beitrag 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?

Code: Alles auswählen

d.d = 1.0 / 0.0
Debug d
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.

Code: Alles auswählen

d.d = Sqr(-1.0)
Debug d
Übrigens bekommt man +Infinity raus, wenn man einfach nur oft genug eine Zahl multipliziert. Das funktioniert also schon.

Code: Alles auswählen

d.d = 1.0
For i = 1 To 309
	d * 10.0
Next
Debug d
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Division durch 0 verboten.

Beitrag 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))
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Division durch 0 verboten.

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Division durch 0 verboten.

Beitrag 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
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Division durch 0 verboten.

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Division durch 0 verboten.

Beitrag 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).
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Division durch 0 verboten.

Beitrag 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. :-D Dann ist das wohl wirklich nur ein Problem vom Debugger. Diese Meldung sollte man ausschalten können.
Bild
Beefi
Beiträge: 88
Registriert: 16.01.2017 17:38

Re: Division durch 0 verboten.

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Division durch 0 verboten.

Beitrag von NicTheQuick »

Ja, das weiß ich alles. :roll:
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.
Bild
Antworten