Fixed-Point-Arithmetik

22.11.2025 4 Min. Lesezeit

Fixed-Point-Arithmetik - Die heimlichen Helden der frühen Spieleentwicklung

In den vorherigen Abschnitten haben wir gesehen, dass moderne Systeme stark auf Fließkommazahlen setzen und dass deren Effizienz eng mit der Wortbreite verknüpft ist. Doch in der Frühzeit der Computer - insbesondere während der Ära der „Bit Wars“ - spielte ein anderer Ansatz eine zentrale Rolle:

Fixed-Point-Arithmetik

Sie war lange Zeit die praktische Antwort auf ein Problem, das wir heute oft als selbstverständlich betrachten: Wie rechnet man effizient mit Kommazahlen, wenn die Hardware dafür eigentlich nicht gemacht ist?


Das Grundprinzip: Komma ohne Komma

Der Begriff „Fixed Point“ bedeutet wörtlich:

Der Dezimalpunkt (genauer: Binärpunkt) hat eine feste Position.

Statt eine Zahl flexibel in Mantisse und Exponent aufzuteilen (wie bei Float), wird bei Fixed-Point einfach festgelegt:

  • Ein Teil der Bits gehört zum Ganzzahlanteil
  • Ein Teil gehört zum Nachkommaanteil

Beispiel (16 Bit insgesamt):

[ 8 Bit ganzzahlig ][ 8 Bit Bruchteil ]

Die Zahl wird dann interpretiert als:

Wert = gespeicherter Integer / 2^8

Ein konkretes Beispiel

Angenommen, wir speichern die Zahl:

Wert = 1.5

In einem Fixed-Point-System mit 8 Nachkommabits:

1.5 × 2^8 = 384

Gespeichert wird also:

384 (als Integer)

Beim Lesen wird zurückgerechnet:

384 / 256 = 1.5

Der Computer sieht also weiterhin nur eine Ganzzahl - aber wir interpretieren sie als Kommazahl.


Warum war das so wichtig?

Frühe Prozessoren (8- und 16-Bit) hatten ein großes Problem:

Sie konnten keine Fließkomma-Arithmetik in Hardware.

Das bedeutete:

  • Float-Berechnungen mussten in Software emuliert werden
  • Das war extrem langsam
  • Es verbrauchte viel Speicher

Fixed-Point bot dagegen entscheidende Vorteile.


Die drei großen Vorteile von Fixed-Point

1. Geschwindigkeit

Integer-Operationen sind extrem schnell, da sie direkt von der CPU unterstützt werden.

Fixed-Point nutzt genau diese Stärke:

  • Addition → normale Integer-Addition
  • Subtraktion → normale Integer-Subtraktion
  • Multiplikation → mit einfacher Skalierungskorrektur

Ergebnis: um Größenordnungen schneller als Software-Floats


2. Determinismus

Ein oft unterschätzter Vorteil:

Fixed-Point ist vollständig deterministisch und exakt.

Während Floats Rundungsfehler einführen, gilt bei Fixed-Point:

  • gleiche Eingabe → exakt gleiche Ausgabe
  • keine versteckten Rundungsartefakte

Das ist besonders wichtig in:

  • Spielen (Reproduzierbarkeit)
  • eingebetteten Systemen
  • Steuerungslogik

3. Speicherkontrolle

Bei Fixed-Point weiß man genau:

  • wie viele Bits für Ganzzahlen reserviert sind
  • wie viele Bits für Nachkommastellen

Das ermöglicht präzise Kontrolle über:

  • Wertebereiche
  • Genauigkeit

Der große Nachteil: Begrenzung und Aufwand

Diese Vorteile haben jedoch ihren Preis.

Feste Skala

Das größte Problem:

Die Position des „Kommas“ ist fix.

Das bedeutet:

  • kleiner Wertebereich ODER
  • geringe Genauigkeit

Du musst dich entscheiden.


Manuelle Skalierung

Der Entwickler muss ständig darauf achten:

  • wann Werte skaliert werden müssen
  • wann nach einer Multiplikation wieder geteilt wird

Fehler hierbei führen schnell zu:

  • Überläufen
  • falschen Ergebnissen
  • schwer auffindbaren Bugs

Fixed-Point in der Praxis: Spieleentwicklung

In der Ära der Bit Wars war Fixed-Point allgegenwärtig.

Bewegung und Physik

Frühe Spiele wollten flüssige Bewegung darstellen:

Problem:

  • Pixel sind ganzzahlig
  • Bewegung ist kontinuierlich

Lösung:

Position = 100.25 Pixel

Intern: 100.25 × 256 = 25664

Damit konnte man:

  • sanfte Bewegung berechnen
  • aber dennoch effizient auf Integer-Hardware arbeiten

3D-Grafik (späte Phase)

Selbst frühe 3D-Engines (z. B. auf PlayStation 1):

  • nutzten massiv Fixed-Point
  • weil Floating Point zu langsam war

Die gesamte Transformationsmathematik lief oft in Integerarithmetik mit Skalierung.

Warum Floats Fixed-Point verdrängt haben

Mit zunehmender Wortbreite (32 Bit, 64 Bit) änderte sich die Situation:

  • Prozessoren bekamen Floating Point Units (FPUs)
  • Float-Operationen wurden hardwarebeschleunigt
  • Programmierung wurde deutlich einfacher

Plötzlich galt:

Warum mühsam skalieren, wenn die Hardware das für uns übernimmt?

Dennoch: Fixed-Point ist nicht tot
Auch heute hat Fixed-Point seinen Platz:

Embedded Systems

In Mikrocontrollern ohne FPU:

  • günstiger
  • schneller
  • energieeffizienter

Echtzeitsysteme

Wenn absolute Vorhersagbarkeit nötig ist:

  • keine Rundungsüberraschungen
  • keine plötzlichen Genauigkeitsverluste

Spezialfälle (z. B. Audio, DSP)

Digitale Signalverarbeitung nutzt oft Fixed-Point:

  • exakt definierte Präzision
  • optimale Nutzung begrenzter Hardware

Verbindung zum großen Ganzen

Mit Fixed-Point schließt sich ein wichtiger Kreis: Wir haben gesehen:

Integer → exakt, aber keine Brüche
Float → flexibel, aber ungenau
Fixed-Point → Kompromiss aus beiden

Und genau hier zeigt sich ein zentrales Prinzip der Informatik:

Jede Darstellung von Zahlen ist ein Kompromiss zwischen Genauigkeit, Geschwindigkeit und Speicher.

Ein mentales Gesamtbild

Du kannst dir die drei Systeme so vorstellen:

Integer → „Ganzzahlwelt“ - schnell und exakt, aber grob

Fixed-Point → „Lineal mit festem Maß“ - präzise, aber begrenzt

Floating Point → „flexibles Maßband“ - vielseitig, aber nicht exakt

Fazit: Die unsichtbare Grundlage vieler Klassiker

Die Spiele der 8-, 16- und oft auch 32-Bit-Ära hätten ohne Fixed-Point so nicht existieren können. Es war die Brücke zwischen:

  • den begrenzten Möglichkeiten der Hardware
  • und dem Wunsch nach flüssiger, realistischer Darstellung

Und auch wenn es heute oft im Schatten moderner Floating-Point-Systeme steht, bleibt Fixed-Point ein hervorragendes Beispiel dafür, wie:

clevere Repräsentation die Grenzen der Hardware überwinden kann - lange bevor diese selbst leistungsfähig genug ist.