try-catch frage
-
Ich halte Exceptions bei Logikfehlern für eine schlechte Idee. Eine Division durch Null darf in einem korrekten Programm nie auftreten. Man kann eine solche Ausnahme nicht sinnvoll behandeln, denn der Nenner hätte gar nie erst 0 sein dürfen. Das einzig Vernünftige ist also den Bug zu fixen. Daher würde ich wenn überhaupt zu
assertgreifen. "Wenn überhaupt", da moderne Debugger wahrscheinlich ebenso wieassertsofort anhalten, wenn durch Null dividiert wird.Mir ist durchaus bewusst, dass Benutzereingaben o.Ä. zu einer Null führen können, aber die Korrektheit sollte meiner Meinung nach direkt beim Einlescode geprüft werden und nicht erst bei Berechnungen.
-
Nexus schrieb:
Mir ist durchaus bewusst, dass Benutzereingaben o.Ä. zu einer Null führen können, aber die Korrektheit sollte meiner Meinung nach direkt beim Einlescode geprüft werden und nicht erst bei Berechnungen.
Das geht aber nur, wenn der eingegebene Wert mehr oder minder direkt dort auftaucht. Wenn komplexere mathematische Umrechnungen vorkommen geht das nicht mehr so einfach (Numerik, iterative Algorithmen etc.).
Exception sind aber auch hier eher selten die Lösung.
-
Ich frage mich wieso überhaupt eine Null in eine Variable einschleichen kann ^^
In meiner Philosophie wäre das x mal teilen also z.b: die fünf 3 mal Teilen = in 4 Stücken = 1,25. Wenn ich den Kuchen 3 mal teile, habe ich auch 4 Stücke.
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)
...Aber der Divisor heisst "in x Stücken" wenn schon 0 dann wäre das im umgangssprachlichen Ausdruck "in 0 Stücken" 5 / 0 = 0
Ist die Funktion Division eigentlich intern im Prozessor eingebaut oder ist das auch eine Programmierung?
Wobei dass schnell am try-catch Thema vorbeigeht, sorry...
-
Übersehe ich da einen Smiley oder ist mein Ironiedetektor sonstwie kaputt?
-
xBlackKnightx schrieb:
Ich frage mich wieso überhaupt eine Null in eine Variable einschleichen kann ^^
In meiner Philosophie wäre das x mal teilen also z.b: die fünf 3 mal Teilen = in 4 Stücken = 1,25. Wenn ich den Kuchen 3 mal teile, habe ich auch 4 Stücke.
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)
...Das kannst du schon so definieren. Dann musst du aber auch eine komplett andere Algebra darauf aufbauen, wenn du damit rechnen willst.

Hatte darüber mal eine lange Diskussion mit meiner Gastmutter in Australien. Die hat mir das auch nicht geglaubt, dass Division durch 0 nicht 0 (oder die Ursprungszahl) gibt (respektive nicht so definiert ist). ^^Ist die Funktion Division eigentlich intern im Prozessor eingebaut oder ist das auch eine Programmierung?
Kommt auf den Prozessor drauf an. Kann sein, muss aber nicht. Division braucht relativ viel Hardware.
//Edit:
Zum Glück gibt es eine exakte Definition, wie die Division definiert ist. Und die braucht keinen (missverständlichen) Text dazu.
-
Zu deiner Philosophie:
Die Division ist die Umkehrfunktion der Multiplikation. Und wie willst du das multiplizieren mit 0 umkehren? Das geht nicht, es existiert keine sinnvolle Umkehrung ==> die Division durch 0 ist nicht definiert.Zur Implementierung:
Auf Hardwareebene hat man entweder Multipliers oder Adders. Mann kann ja mit Adders auch Multiplikationen durchführen.
Je nach Hardwarearchitektur hast du dann ein anderes instruction set. In deiner IA32-Architecture hast du bestimmt einen multiplier.
Diese Hardwareinstruktionen sind mit elektronischen Schaltkreisen implementiert.*Edit
Mist, ging ja um Division und nicht um Multiplikation ^^
-
icarus2 schrieb:
Zur Implementierung:
Auf Hardwareebene hat man entweder Multipliers oder Adders. Mann kann ja mit Adders auch Multiplikationen durchführen.Wobei das ein nicht-exklusives "oder" ist oder wie addierst du 2 und 3 lediglich mit Multiplikation?

Adder sind so saugünstig. Die entstehen fast von alleine. ^^
-
drakon schrieb:
icarus2 schrieb:
Zur Implementierung:
Auf Hardwareebene hat man entweder Multipliers oder Adders. Mann kann ja mit Adders auch Multiplikationen durchführen.Wobei das ein nicht-exklusives "oder" ist oder wie addierst du 2 und 3 lediglich mit Multiplikation?

Adder sind so saugünstig. Die entstehen fast von alleine. ^^
Och, ich drücke mich heute mal wieder unverständlich aus ^^
Ich meinte man braucht entweder einen Adder oder einen Multiplier, um Multiplikationen durchzuführen.
Für Additionen nimmt man natürlich immer einen Adder
Aber man hat nicht immer einen Multiplier.*Edit
@ Drakon
Hattet ihr eine spezifische Architektur in der Digitech? Wir verwenden die MIPS Architektur.
-
icarus2 schrieb:
*Edit
@ Drakon
Hattet ihr eine spezifische Architektur in der Digitech? Wir verwenden die MIPS Architektur.Wir hatten MRC. Wurde von Wirth designt und von Lisa Liu (gab bei uns neben Capkun Digitech) implementiert auf dem Board.
-
xBlackKnightx schrieb:
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)Und da 5 * 0 ja wieder schön 5 ergibt, macht das Ganze auch wunderbar Sinn.
Übrigens, 5/1 = 5 und 5/2 = 2.5... Durch x dividieren heisst nicht "x mal teilen" sondern "in x Stücke teilen". Und du kannst den Kuchen nicht in 0 Stücke teilen, mindestens eins hast du immer. Nur so...
-
Nexus schrieb:
xBlackKnightx schrieb:
5 / 0 null mal teilen = 5 (ganzer Stück)
5 / 1 ein mal teilen = 2,5 (in zwei Hälften)
5 / 2 zweimal teilen = 1,66 ( 3 Stücke)Und da 5 * 0 ja wieder schön 5 ergibt, macht das Ganze auch wunderbar Sinn.
Übrigens, 5/1 = 5 und 5/2 = 2.5... Durch x dividieren heisst nicht "x mal teilen" sondern "in x Stücke teilen". Und du kannst den Kuchen nicht in 0 Stücke teilen, mindestens eins hast du immer. Nur so...
Du versteht das nicht.
Wir denken:
20 Bier und 5 Leute => 20/5=4 => Jeder kriegt 4 Bier.Er denkt:
20 Bier und 5 Leute => 20 mit vier äquidistanten Teilungspaapstreifenseparatierungsabstandshaltertrennelementen dazwischen => Jeder kriegt 4 Bier.Beide Denken sind gleichwertig.
Aber er hat kein Problem mit der Teilung durch 0, weil sie bei ihm nicht vorkommen kann.
Wir:
cin>>bier;
cin>>leute;
return bier/leute;//throws if leute==0Er:
cin>>bier;
cin>>leute;
unsigned int teilungen=leute-1;//throws if leute==0
return teilungsgrößebeisovielen(bier,teilungen)//nothrow
-
Nexus schrieb:
Und du kannst den Kuchen nicht in 0 Stücke teilen, mindestens eins hast du immer. Nur so...
Soll ich dir das Gegenteil beweisen? Du besorgst aber den Kuchen. :p
-
SeppJ schrieb:
Tja, nur dass Division durch Null in C++ keine Exception wirft.
Wie ist denn das zu verstehen? Noch gestern habe ich einen Run-time-Fehler (Division durch 0) im VS2008 (debug-Modus) erhalten.
-
Die Kuchenmetapher ist ja ganz nett, aber aus Metaphern zu folgern ist immer eine haarige Angelegenheit. Ein Kuchen dreimal geteilt bedeutet für mich sechs Stücke, noch Fragen?
Grundsätzlich ist die Division in der Definition eines algebraischen Körpers nicht enthalten - es gibt zunächst nur Addition und Multiplikation. Die Division ist eine kosmetische Schreibweise für Multiplikation mit der Inversen eines Elements, d.h. man definiert
a / b = a * b-1
wobei b-1 definiert ist durch b * b-1 = 1. 0 hat in den reellen Zahlen kein Inverses (ich wüsste jetzt auch aus dem Stand keinen Körper, in dem das der Fall ist), und deswegen ist die Definition durch 0 undefiniert. Damit hat es sich auch schon.
@Rewind: Es geht um Exceptions im Sinne von C++ (d.h. throw, try, catch), nicht um Kerneltraps.
-
[Rewind] schrieb:
SeppJ schrieb:
Tja, nur dass Division durch Null in C++ keine Exception wirft.
Wie ist denn das zu verstehen? Noch gestern habe ich einen Run-time-Fehler (Division durch 0) im VS2008 (debug-Modus) erhalten.
Schau mal auf Seite 1 den letzten Beitrag an.
-
Eine passendere Metapher ist nicht das Aufteilen sondern das Verteilen. 10 Kuchenstücke sollen gerecht an 5 Leute verteilt werden -> jeder bekommt 2 Kuchenstücke. Bei 2 Leuten bekommt jeder 5. Bei einem Leut bekommt jeder 10 Stücke. Und bei 0? Bekommt jeder 0? Oder 10? Oder 10000000? Reichen würde es. Aber es gibt keine sinnvolle Antwort, man kann Disivsion mit 0 nicht sinnvoll definieren.
-
seldon schrieb:
Die Kuchenmetapher ist ja ganz nett, aber aus Metaphern zu folgern ist immer eine haarige Angelegenheit. Ein Kuchen dreimal geteilt bedeutet für mich sechs Stücke, noch Fragen?
Zwischen 4 und 8, je nach Technik.
Kuchen
-
seldon schrieb:
0 hat in den reellen Zahlen kein Inverses (ich wüsste jetzt auch aus dem Stand keinen Körper, in dem das der Fall ist)
0 kann kein Inverses haben, denn:
Sei b das Inverse zu 0, d. h. 0*b = b*0 = 1.
1-1 = 0 <=> (1-1)*b = 0*b <=> 1*b - 1*b = 1 <=> 0 = 1 <=> Der Körper hat nur ein Element, was per Definition nicht möglich ist.