 Hallo und willkommen zu der Femme-Channel. Der nächste Speaker ist Antonius Fri. Ja, hallo und willkommen zum Vortrag, Einführung in die dunkle Kunst der Fließkommar-Zahlen und warum A mal N nicht immer dasselbe ist wie N mal das Derbezahl zu addieren. Könnt ihr Webplayer einfach die Sprache ändern von native to translated? Und nun, have fun with the talk. So, eure Übersetzer hier sind Kuh und Pink Dispatcher und los geht's. Hallo, ich bin Antonius und ich schräge von Fließkommar-Zahlen, die in Computerprogrammier-Sprachen sind normalerweise die Zahlen, die einen Dezimalkommar haben, wie die Links und überwiegend die auf der rechten Seite, die ganzen Zahlen benutzen einen anderen Typ aus ein JavaScript, da sind sie immer floating point, immer Fließkommar. Also ich immer, wenn ihr schon mal programmiert habt, dann habt ihr schon mal damit zu tun gehabt und habt vielleicht gemerkt, dass die manchmal etwas komisch sich verhalten. Zum Beispiel, ich starte mal hiermit, das ist eine sehr große Zahl. Einmal 10 hoch 16, eine 1 mit 16 Nullen und jetzt nehme ich 24. Das ist nur eine relativ kleine Zahl und ich addiere die zu der großen Zahl und dann subtrahiere ich die. Und das macht eigentlich keinen Sinn, dieselbe Zahl zu addieren, wieder zu subtrahieren. Das mache ich mal. Aber wenn wir das machen, dann kriegen wir 24 raus und nicht 25 und das ist seltsam. Das kann man wohl sagen und lasst uns mal andere Sachen versuchen. So, jetzt addieren wir eins zu der großen Zahl und gucken, was sich ändert und es ändert sich gar nichts. Das heißt, man soll das nicht malen. Man soll Fließkommar-Zahlen eigentlich nicht auf Gleichheit vergleichen, weil es Rundungsfehler gibt. Aber diese zwei Fließkommar-Zahlen sind exakt gleich. Ich habe eins addiert und es hat sich nichts geändert. Das ist auch seltsam. Und für diesen Vortrag habe ich nicht, mache ich keine, sondern das komplexen Sachen. Aber ich bin nicht sicher, wie viel Mathe ihr könnt und deswegen habe ich mich entschieden, einfach mit ganz einfachen Sachen anzufangen. Und der Anfang ist relativ einfach und dann wird es immer etwas komplizierter. Und ich glaube, das ist ein guter Kompromiss. Der Anfang ist vielleicht etwas, etwas langweilig, wenn man schon sich damit auskennt. Und wenn man das erste Mal davon hört, ist das Ende vielleicht etwas schwierig zu verstehen. Aber ich hoffe, das ist ein guter Kompromiss hier. So, jetzt fangen wir an mit Teil 1. Und für die Erklärung fange ich an mit einem, mit dem Display der Anzeige von einem Taschenrechner, ganz viele Nullen. Und warum das nützlich ist, ist, man hat nur eine begrenzte Anzahl von Stellen. Und Computer haben auch nur eine begrenzte Anzahl Stellen und man sieht etwas von den Sachen, die hier passieren können. Und das ist eine sehr einfache Maschine. Ich kann Zahlen addieren und dann kann ich auch eine andere Zahl eingeben. Und dann kann ich die addieren und das ist das Ergebnis. Und ich viel mehr kann ich damit nicht machen, aber es gibt diese beiden anderen Knappe, die ich und ich kann die Zahl einfach verschieben. Eine Stelle nach links oder eine Stelle nach rechts. Und man kann sehen, was da passiert. Und das geht auch dann über das Fließkomma, über das Komma hinaus, über den letzten Mal Punkt. Und nur, weil das etwas wichtig, denn ich zeige gerade, was es ist, denn mit unserem Zahlensystem, was diese Maschine benutzt, wenn wir das nach rechts verschieben, multipliziert es das nach links, multipliziert es das mit 10. Das heißt, 10 mal 2 ist 20. Und wenn man es nochmal verschieben, dann ist nochmal mal 10, das ist 200. Und das ist schön. Und das funktioniert auch andersherum. Das heißt, wenn man es nach rechts verschiebt, dividiert es durch 10. Das heißt, von 200 auf 20 und dann von 20 zurück nach 2. Okay. Das ist eine fundamentale Eigenschaft von unserem Zahlensystem. Denn was das bedeutet ist, dass wir nur die Ziffern von 0 bis 9 brauchen. Wir haben keine einzelne Ziffer für 10, denn wir benutzen die Ziffer für 1 und verschieben das einmal. Und wenn wir diese Verschiebung gemacht haben, wird es durch mit 10 multipliziert und dann stellen wir die 10 dadurch dar. Und wir brauchen keine neue Ziffer dafür. Und das wird später nochmal wichtig. Und jetzt machen wir ein bisschen Mathe mit dieser Maschine. Ich bin ein Astrophysiker und deswegen und will einfach, braucht keine Entschuldigung dafür, dass ich ein bisschen das Fieses zeigen will. So, wir haben die Masse von dem Mond von Mars von Deimos in Kilogramm und es ist eine 8 und 14,0. So, jetzt fange ich mal an zu tippen. 1, 2, 3, 4, 5, 6. Und jetzt bin ich schon am Ende angekommen von der Anzeige, die wir hier zur Verfügung haben. Und das ist etwas unpraktisch, weil ich will die ganze Zahl eintippen und wir haben nur 8,0, die uns fehlen jetzt. So, was machen wir? Ich schreibe die einfach hin. Und ich meine, du weißt, was das bedeutet. So, ich schreibe einfach hin, 8,0. Und dann musst einfach 8,0 dazuzählen und dann haben wir die Zahl, die wir eigentlich haben wollen. Und jetzt habe ich diesen Zähler hier und ich könnte einfach 1,0 weniger hingeschrieben haben und schreibe 9 zusätzliche Nullen. Oder ... und ich könnte auch einfach noch eine 0 sparen und noch eine und noch eine und noch eine. So, und jetzt sind wir hier 1,1,8 und 14,0. Das schreibe ich einfach so hin, das einfach zu verstehen. Und das andere, was noch interessant ist, was man merkt, ist, wenn man schieben und null hinzufügen, ist irgendwie dasselbe. Ich kann nach links schieben und dasselbe wie wenn ich eine 0 von dem Zähler rechts oben entferne und die einfach stattdessen hinschreibe. Und ich kann sie nach rechts verschieben, das könnte eine 0 rechts oben hin. Und eigentlich, eigentlich jetzt, wenn wir über Schubts reden, könnten wir auch einfach weiter nach rechts schieben. Und jetzt macht es nicht mehr so viel Sinn, darüber zu denken als die Anzahl von 0, aber es funktioniert immer noch, wenn ihr über die Anzahl von Verschiebungen denkt. Nach links ist in die Richtung. Ja, die Anzahl von Schiften, um eure Zahl zurückzubekommen. Wenn euer Display größer wäre, könnten wir sogar die ganze Zahl nach links schiften. Wie hier gezeigt, also Schifts sind dasselbe wie 0 hinzufügen und das funktioniert auf die gleiche Art und Weise. Also wenn wir einmal das hier haben, können wir ein bisschen richtige Mathematik machen. Lass uns hier zurückgehen und sagen wir mal, ich möchte ein Kilogramm, ein einziges Kilogramm hinzufügen. Und ich mache es die offensichtliche, aber falsche Art. Ich werde einfach 1 hinzufügen und das addieren. Und jetzt sehen wir, wenn ich auf die ganze Zahl schaue und dann wieder schifte, dann habe ich nicht eine 1 hinzugefügt, sondern eine 1 mit 8 0. Und wenn wir jetzt zurückgehen, dann macht es einen bisschen Sinn, weil hier war die 1, die wir hinzugefügt haben, war gerade bei der Einstellung 8 Schifts. Das heißt, ich möchte jetzt aber keine 1 mit 8 Schifts, sondern ich möchte eine 1 mit 0 Schifts. Also was machen wir? Wenn ihr euch erinnert, was ich gerade gesagt habe, können wir die Zahl da oben ändern, indem wir verschieben. Das heißt, ich kann die Zahl nach rechts verschieben und die Anzahl der Verschiebungen erhöhen. Also kann ich es einfach weiter nach rechts verschieben und die Zahl immer weiter erhöhen. Und am Ende ist der Counter 8. So, und jetzt können wir addieren. Und wenn wir jetzt dieselbe Verschiebung nach links machen wie eben, dann werden wir sehen, dass wir wirklich nur einen Kilogramm hinzugefügt haben. Das ist also ein wichtiger Punkt, wenn wir mit Fließkommazahlen arbeiten. Immer dran denken, zwischen Schifts und den Counter. Jetzt können wir sehen, warum wir die Masse von diesem bestimmten astronomischen Körper genommen haben, denn wenn er ein kleines bisschen schwerer wäre, zum Beispiel 1 Kilogramm, dann wäre die 100 Gramm statt, 1 Kilogramm dann wäre die 1 verschwunden. Also hätte die Addition nichts geändert. Das ist ziemlich ähnlich zu dem, was Astronomermatten uns ein bisschen weiterzuspinnen. Und wir hätten 1 Kilogramm genommen oder 1,2 Kilogramm, dann wäre die 1 noch da geblieben, aber das 0,2 wäre verschwunden. Also wenn wir dann die Masse nochmal berechnet hätten, dann wäre es quasi von 1,2 Kilo auf 1 Kilogramm gegangen. Und das ist ähnlich wie der andere Fall. Und um das wirklich zu verstehen, müssen wir ein bisschen tiefer gehen. Und die einzige Sache, die ich jetzt ändern werde, und es klingt vielleicht wie ein kleines Detail, erinnert euch eine Zahl nach links schiften, würde es mit 10 multiplizieren und würde es mit 10 multiplizieren. Und jetzt werde ich diesen Faktor zu 2 ändern. Also jetzt habe ich den Front geändert. Und jetzt lass uns schauen, was das macht. Ich habe 1 eingefügt und wenn ich das schifte, sieht das aus wie 10, aber es ist nicht 10, weil unser Schifffaktor 2 ist und 1 mal 2 ist einfach 2, das ist 2. Einig von euch wissen das. Das nennt sich Spinnerdarstellung und der Grund, warum Computer Spinnerdarstellung mögen, ist, weil wir jetzt keine Zahl mehr, keine Ziffer für 2 brauchen. Wir brauchen keine höheren Ziffern, wir brauchen nur 0 und 1. Und was das bedeutet, ist, wir nehmen einfach 1 oder 0 als Ziffern und Computer mögen das. Lass uns das anwenden, um wirklich zu verstehen, was mit der 24 und der 25 passiert ist. Ich werde jetzt nicht wirklich die 16 als Zahl benutzen, denn sie ist wirklich sehr groß, sondern ich werde euch etwas Äquivalentes zeigen. Eine andere große Zahl, die ich verwende, die ich hier nehmen werde, ist die Zahl, die ihr hier sehen könnt. Eine 1 mit 7 0 und 9 Extra Schiffs. Und das hier ist unsere Zahl 25, das müsst ihr mir jetzt einfach glauben. Und wir möchten die addieren, d.h. wir müssen die Schiffs angleichen. Das ist bei 0 Schiffs, das ist bei 9 Schiffs. Und wir müssen das jetzt auf 9 Schiffs kriegen, d.h. wir müssen es nach rechts schieben. Und jetzt könnt ihr sehen, dass da schon eine Zahl abgeschnitten wurde. Jetzt werden wir das addieren und dann werden wir runden. Und dann werde ich es wieder abziehen, wie hier. Und dann können wir es wieder zurückschieben und machen diese zusätzlichen Schiffs. Und es ist genau so ähnlich wie die Zahl, mit der wir angefangen haben, außer diese 1 am Ende, die fehlt. Und das wurde weggerundet nach der Addition. Und d.h. jetzt haben wir eine Ziffer fehlt von der 25 und deswegen haben wir jetzt die 24. Und warum wir von 25 auf 24 gekommen sind, ist dasselbe wie im Dezimalsystem, wo wir von den 1,2 Kilogramm nur auf die 1 Kilogramm gekommen sind, weil die letzte Ziffer einfach abgerundet wurde auf 0, außer dass das hier ist eben nicht die letzte Dezimalstelle, sondern eine Binärstelle. Und wenn das zurückkonvertiert wird ins Dezimal, und das ist dann nicht mehr ganz so einfach zu sehen, dass es nur eine abgeschnitten Stelle ist, wenn wir von 25 auf 24 gehen. Und ich habe gerade gesagt, es gibt komische Sachen hier mit der Rundung und das ist nur etwas vornehmen ausgedrückt. Aber was meine ich damit? Und bisher war alles, worüber wir gesprochen haben, wie nur die allgemeinen Eigenschaften von Fliesgommazalen. Man braucht kein spezielles System, aber was wir als Nächstes machen, dafür brauchen wir etwas Spezielles. Und wir gucken uns mal an, ein ganz bestimmtes System von Fliesgommazalen. Und das ist das Einzige, was heute noch benutzt wird, mehr oder weniger. Und das ist IEEE 754 der Standard. Was egal, ob man Ruby oder Python oder JavaScript oder C oder Rust oder C-Sharp oder irgendwas, was auch immer. Wenn man Fliesgommazalen benutzt, den Float-Datentyp, dann ist das garantiert, fast garantiert, ist IEEE 757. Aber was sagt uns das über, wie wir Fliesgommazalen benutzen müssen? Und das spezifiziert natürlich verschiedene Längen und das ist standardisiert. Und es sagt auch ein standardisiert Art, wie wir Fliesgommazalen darstellen. Das heißt, wenn ich diese 25 nehme, dann müssen wir sie so verschieben, dass es nur eine Stelle vor dem Dezimalpunkt gibt. Wir können die einfach rumschieben und das hilft uns aber, sodass wir nur eine gültige Darstellung für jede Zahl haben. Und weil wir das so machen, brauchen wir die Stellen davor alle nicht mehr. Und weil die erste Ziffer immer eine Eins ist, es kann keine Null sein, sonst könnten wir es einfach wieder zurück schiften, schieben bis es eine Eins wäre. Also brauchen wir die Eins auch gar nicht zu speichern. Das heißt, es ist ein sehr effizientes Speicherformat. Und was steht da noch drin? Es steht auch, wenn wir eine Operation ausführen mit einer Zahl oder mit zwei Zahlen, dann müssen wir das tatsächliche Ergebnis ausrechnen von der Operation und mit so viel Genauigkeit, wie wir können, um die genau darzustellen. Und erst danach können wir es auf die Anzahl der Stellen, die wir zur Verfügung haben, zurückrunden. Und, ja, genau. Und es beschreibt auch einige Rundungsarten für diese spezielle Rundung. Und man kann es einfach immer runterrunden oder immer aufrunden oder etwas so was machen, wie wir machen auf die nächstmögliche Zahlrunden, so wie wir es gewohnt sind von Dezimalzahlen. Und dieses extra Wissen, damit können wir jetzt uns angucken, dass etwas ein Tweet, den ich vor einiger Zeit gemacht habe, der Grundlage für diesen Vortrag, denn wenn man eine Zahl mit zwei multipliziert, ist es dasselbe wie die, die zu sich selbst zu addieren. Also zwei mal A ist dasselbe wie A plus A. Und wenn ich die Zahl mit drei multipliziere, ist dasselbe wie sie drei mal zu sich selbst zu addieren. Und vier mal, genau das gleiche, und fünf mal das gleiche. Und es zeigt sich, wenn man das hier macht in Fliescomma, dann sind diese exakte Equivalenzen exakte Gleichheiten. Und außer bei sechs mal A, der Fall für sechs mal A ist nicht genau gleich. Und was intuitiv hier passiert, ist, dass auf der rechten Seite gibt es alle diese Additionen und jede Addition ist eine getrennte Operation. Das heißt, um die Summe auszurechnen als ein exaktes Ergebnis und dann zu runden. Und dann erst addiert es die weitere Kopierzahl und rundet wieder. Das heißt, es macht dies mehrfach. Und für die ersten Schritte ist es zufällig gerade so, dass alle diese Rundungsfehler sich ausgleichen. Und nur bei dem letzten hier, nur für sechs mal A, ist es dann schließlich so, dass es nicht mehr zusammenpasst. Das heißt, sechs mal A, also A plus, A plus, A plus, A plus, A plus, A plus, A, sind fast gleich. Die letzte Ziffer ist ein bisschen anders, aber die sind nicht genau gleich. Und das ist der Grund im Prinzip, warum Leute sagen, man sollte Fliescomma Zahlen nicht auf Gleichheit vergleichen, denn diese Rundungsfehler können sich addieren und dann ist das Ergebnis verfälscht. Aber ich glaube, es ist trotzdem interessant zu gucken, warum das für die ersten Fälle funktioniert und warum es dann bei dem letzten nicht mehr funktioniert. Und lasst uns mal anfangen mit dieser Zahl hier. Das ist die Zahl, mit der wir das probieren. Es gibt vier extra Verschiebungen und es hat dieses bestimmte Muster, das wir hier sehen. Und jetzt werde ich die mit sich selbst addieren, zu sich selbst addieren. Und dann haben wir dieses hier und wir haben nur eine Ziffer vor dem Dizinalpunkt. Das heißt, wir müssen das zurück schiften und die Anzahl der Schiffs erhöhen. Und wir können sehen, bei dieser Verschieba-Operation, bei diesem Schiften, haben wir eine Zifferangenauchkeit am Ende verloren. In diesem Fall macht es nichts, denn diese Ziffer ist Null und weil wir mit zwei multipliziert haben und das mit zwei multiplizieren ist eine... mit zwei multiplizieren ist immer eine Links-Verschiebung und deswegen ist die letzte Ziffer immer Null. Das heißt, wenn wir es zurück schieben, sind wir sicher, dass wir nur eine Null verlieren hinten und es ändert die Präzision gar nicht. Und was das bedeutet, ist hier auf dem Bildschirm, ist, wir haben hier das exakte Ergebnis von zweimal A oder A plus A und es gibt keinen Unterschied. Also machen wir mal den nächsten Schritt. Jetzt schieben wir das nach oben und oben ist die Zahl, die wir gerade ausgerechnet haben und darunter ist die Originalzahl und ich habe das zurückgeschiftet, um das zu addieren, um die Anzahl der Schiffs oben und dem anzupassen, dass das wieder stimmt mit der Anzahl der Schiffs und jetzt können wir das addieren, dann haben wir dieses und jetzt hängt am Ende schon eine Zahl über aber wir haben auch zwei vor dem Punkt, das heißt, wir müssen es zurück schieben und haben jetzt sechs Schiffs und jetzt gibt es Ziffern hinter dem digitalen Malpunkt und wir müssen jetzt runden und was das bedeutet, ist, wenn wir jetzt diese Zahl nehmen, die fast dreimal unsere Zahl ist, aber nicht ganz genau und nochmal eine Kopie von der Zahl dazufügen, dann kann das Ergebnis nicht genau viermal das Original sein. Also lasst uns das jetzt noch mal ein. Also das ist das, was wir jetzt machen, das ist das, was wir jetzt machen, das ist das, was wir jetzt machen, also lasst uns schauen, was passiert, ich werde das hier nach oben schieben und dann werde ich nochmal die Zahl addieren, diesmal mal zwei, weil sechs Schiffs und jetzt machen wir die Addition und das ist unser Ergebnis um zu vergleichen, was wir Eigenschätten rauskriegen sollen nach der Multiplikation mit vier. Wir haben im Prinzip mit zwei, zwei mal multipliziert und mit jeder Multiplikation haben wir eine Null am Ende und hier sind jetzt zwei Nullen am Ende und nochmal viermal einer Zahl ist ein Genausergebnis, aber jetzt haben wir dieses Ergebnis und wir sehen am rechten Rand ist das Ergebnis von dem Rundungsfehler und jetzt ist es zufällig so, dass dieser Rundungsfehler nochmal weggerundet wird, wenn wir das mal vier nehmen und zufälligerweise gibt es ein paar andere Fälle, bei denen das passiert, aber mit dem üblichen Rundungscode klappt es zufällig und durch die zwei dass die zwei Additionen sich immer gegenseitig ausgleichen und es ein exaktes Ergebnis ist und wie 4a eine exakte Zahl war und von 4 nach 5 gehen ist dasselbe wie von 2 nach 3 aber nochmal 5 kann nicht genau dargestellt werden denn es wird wieder Zahlen geben, die hinten rausgeschoben werden und schließlich wenn wir von 5 nach 6 gehen dann wird der kleine Rundungs-Trick, den wir benutzt haben der gemacht hat, dass es gerade so funktioniert funktioniert dann nicht mehr das heißt, 6 mal a und allen Faktoren da drüber wird das nicht mehr zusammen passen das heißt, dann fangen einfach die Rundungsfehler an sich zu sammeln und ja, die größer die Zeit wird also warum machen wir das? ja, in den meisten Fällen ist es wahrscheinlich okay mit dem, womit wir angefangen haben mit dem Hinweis vergleiche Floats nicht auf exakte Gleichheit sondern benutze runde Funktion und einerseits ist es natürlich lustig sich das genauer anzuschauen und der andere Grund ist je nachdem was du machst könntest du Probleme bekommen wo die Rundungsfehler sich ansammeln oder wo Rundungsfehler gerade so funktionieren zufällig und dann teilt ihr durch 0 und kriegt unendlich und teilt nochmal durch 0 und kriegt nann das zeigt euch wie Floats wirklich funktionieren und ist auch wichtig zu wissen warum ihr nur auf ungefähre Gleichheit prüfen solltest und nicht auf exakte Gleichheit ich habe mir ein bisschen in den Fuß geschossen mit diesem Talk weil ich dachte, wow, jetzt kann ich darüber sprechen das ist sehr spannend und komisches Fließkommerzeug und dann habe ich angefangen mit den Grundlagen und jetzt bin ich ungefähr am Ende angekommen von dem was ich mit einem Talk machen möchte und ich hoffe, dass es das Wert war für euch dass euch die Grundlagen am Anfang gefallen haben und ich hoffe dass ihr nicht enttäuscht seid dass wir nicht ein paar spannere und schönere Details angehen konnten und ich hoffe dass diese kleine Erklärung der Multiplikation verständlich war um ein paar der Lücken zu füllen zum Beispiel die anderen Fälle beim Runden von 3A zu 4A oder für andere Fälle falls ihr das erst mal gesehen habt wird es hier weiteres Material geben wenn ich es schaffe das hochzuladen zwischen dem Vortrag und Kongress zwischen der Aufnahme von dem Vortrag und wenn ihr Fragen oder Feedback habt oder mir sagen wollt dass ich zu viel Grundlagen genommen habe oder zu viel fortgeschrittenes Zeug könnt ihr mich hier finden aber jetzt erstmal Danke fürs Zuhören und ja, tschüss ja, danke dir für diesen interessanten Talk als nächstes kommt um 6 Uhr, warum ihr nicht die Zeitzone selbst implementieren solltet und ein paar Beispiele von der Zeitzone und jetzt die Herald News Show