„Wir nehmen diese Ausrede Grafik, um in diesen Grundlagenfolgen Dinge zu erklären, die überhaupt nichts mit Grafik zu tun zu haben scheinen, aber dann machen wir den Bogen doch wieder zurück.“
Damit schafft Xyrill die passende Einleitung dieser dritten Folge unserer vierteiligen Reihe.
Shownotes
Rückbezug zu STP001: Ganzzahlen
z.B. 8-Bit-Zahlen: ohne Vorzeichen 0 bis 255 oder mit Vorzeichen -128 bis 127Problem 1: Wie stellt man Zahlen mit Nachkommastellen dar?Problem 2: Wie stellt man sehr große Zahlen effizient dar?zwei Optionen: Festkommazahlen und Fließkommazahlenim Prinzip dasselbe wie Ganzzahlen, aber zählt in Schritten von 0,1 oder 0,01 etc.Beispiel: Währungsrechnungen oft mit 4 Nachkommastellen (also auf 0,01 Eurocent genau)gegenüber Fließkommazahlen: schneller und genauer, aber nicht so flexibel (löst nur Problem 1, nicht Problem 2)grundsätzliche Idee: analog zur wissenschaftlichen Zahlennotationz.B. "1,2 Milliarden": nicht als 1.200.000.000, sondern 1,2 x 10^9z.B. "2 Hunderttausendstel": nicht als 0,000002, sondern 2 x 10^-6Vorteil: unabhängig von der Größenordnung kann immer die gleiche Zahl an Ziffern dargestellt werdenin Computern natürlich nicht zur Basis 10, sondern zur Basis 2Bestandteile einer Fließkommazahl
Exponent (E): die Anzahl der ZweierpotenzenMantisse (M): der Teil der Zahl, der nicht in der Potenz stehtinsgesamt also M * 2^E für positive oder -M * 2^E für negative ZahlenRechenoperationen ungefähr analog zum Rechenschieber
z.B. Addition: erst die Exponenten angleichen, dann die Mantissen addieren, dann eventuell nochmal den Exponenten anpassen, damit die finale Darstellung wieder schön kompakt isthier kommt das Überlaufbit aus STP003 wieder ins SpielKodierung: fast immer gemäß IEEE-754-Standard
Problem: wir wollen uns nicht merken müssen, wo in der Mantisse das Komma stehtTrick: wir schieben das Komma so hin, dass die Mantisse mit 1, anfängt, und speichern dann nur den Teil dahinter (normalisierte Zahlen)Ausnahme: beim kleinsten Wert des Exponenten fängt die Mantisse mit 0, an, damit wir auch die Zahl 0 und sehr kleine Zahlen nahe 0 darstellen können (subnormale Zahlen)z.B. für 32 Bit: einfache Genauigkeit ("Single Precision")1 Bit Vorzeichen8 Bit Exponent (Ganzzahl zwischen -127 und 128)23 Bit Signifikand (Mantisse ohne das führende 1, oder 0,)Werte je nach Exponent:Exponent = -127 -> subnormale ZahlenExponent = 128 -> spezielle Werteansonsten -> normalisierte Zahlenim Exponent 128 werden einige spezielle Werte kodiert, die man braucht, damit jede Rechenoperation immer eine gültige Fließkommazahl erzeugt:plus Unendlich: z.B. 1 / 0 = +∞ oder ∞ + ∞ = ∞minus Unendlich: z.B. -1 / 0 = -∞ oder log2(0) = -∞keine Zahl (not a number, NaN): z.B. ∞ - ∞ = NaN oder 0 / 0 = NaN oder log2(-1) = NaNImplementation von Fließkommarechnungen
initial in Software auf Basis von Ganzzahlenseit den 1980ern zunehmend in Hardware (seit den 1990ern auch in PCs)Fallstricke bei Fließkommarechnungen
nicht alle kompakten Dezimalzahlen sind kompakte Binärzahlen: z.B. 0.3/0.2 = 1.4999999999999998bei komplexen Berechnungen können sich kleine Rundungsfehler zu großen Fehlern aufschaukeln, siehe zum Beispiel Kahan-Summenalgorithmus (leider in Wikipedia nur auf englisch)Anwendungsbereiche üblicher Fließkommaformate
doppelte Genauigkeit (64 Bit): für wissenschaftliche Berechnungeneinfache Genauigkeit (32 Bit): für 3D-Grafik (siehe nächste Folge)halbe Genauigkeit (16 Bit), Viertelgenauigkeit (8 Bit): für Training von neuronalen Netzwerken