Fließkommazahlen: Nicht immer so genau, wie man denkt

Bereits das ein oder andere mal habe ich in diversen Foren und auch hier im Blog behauptet, daß Fließkommazahlen vom Type Float (oder auch Single) ihre höchste Genauigkeit im Bereich von -1.0 bis 1.0 haben. Und auch immer hatte ich mir vorgenommen, dies ein wenig genauer auszuführen, was ich hiermit endlich machen möchte.

Ein Float besteht, wie jede andere Zahl in einem Computer (und in jeder Programmiersprache) aus Bits. C# verwendet 32Bits, so wie es im IEEE-754 festgelegt ist, der von den meisten Programmiersprachen auch verwendet wird.

Die Erklärung dafür ist relativ einfach. Die 32 Bits eines Floats sind wie folgt aufgeteilt:

1 Bit für das Vorzeichen
8 Bits für den Exponenten
23 Bits für die Mantisse

Wofür das Vorzeichen-Bit gut ist, dürfte jedem klar sein. Es gibt an, ob die Zahl positiv oder negativ ist.

Die nächsten 8 Bits, der Exponent definieren nun den Wertebereich der jeweiligen Zahl und die letzten 23 Bits, die Mantisse legen die eigentlich Genauigkeit fest.

Der Knackpunkt dabei ist, daß die 23 Bits auf alle Stellen der Zahl, unabhängig davon, ob diese vor oder hinter dem Komma sind, aufgeteilt werden und je mehr Stellen bzw. besser gesagt Bits wir vor dem Komma benötigen, desto weniger stehen uns hinter dem Komma zur Verfügung.

Wie diese Bitaufteilung im Detail funktioniert, darauf möchte ich hier nicht eingehen, sondern schlicht und einfach auf die Wikipedia verweisen, wo dies ganz gut erklärt ist. Dies ist aber ziemlich technisch und wird nur sehr, sehr selten benötigt. Man kann zwar die ein oder andere Berechnung optimieren, wenn man Bitoperationen auf Fließkommazahlen ausführt, aber das möchte ich niemanden empfehlen, da dies sehr kompliziert und auch fehlerträchtig ist.

Übrigens liegt die max. Genauigkeit einer Float-Fließkommazahl bei 7-8 Nachkommastellen.

Advertisements

Veröffentlicht am 16.06.2011 in C#, Grundlagen und mit , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 4 Kommentare.

  1. Hi, wieder mal sehr interessant, gerade über das habe ich in letzter Zeit mal nachgedacht. Ich habe mal gehört, dass eigentlich die 80 Bit bei den meisten Sprachen verwendet wird, stimmt das nicht?

    • Nein, das stimmt nicht ganz… Standard sind bei praktisch allen Sprachen 32 Bit (single/float) und 64 Bit (long). x86 Prozessoren arbeiten aber in der Regel mit einer Fließkommaeinheit (FPU), die eine Genauigkeit von 80 Bit aufweist. Intern arbeiten die Prozessoren also durchaus mit einer höheren Genauigkeit, als später im Datentyp „dargestellt“ wird.

  1. Pingback: Terrain 101: Das erste Dreieck « "Mit ohne Haare"

  2. Pingback: Terrain 101: Transformationen « "Mit ohne Haare"

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: