# Gleitkommaeinheit

Gleitkommaeinheit, FPU (für Floating-Point Unit) oder NPU (für Numeric Processing Unit) sind Begriffe aus der Computertechnik und bezeichnen einen speziellen Prozessor, der Operationen auf Gleitkommazahlen ausführt.

## Allgemeines

Wenn ein Computer Gleitkommaoperationen ausführen soll, gibt es zwei prinzipielle Möglichkeiten:
* Software-Emulation der Funktionen durch die CPU, z. B. unter Verwendung von Gleitkomma-Libraries
* Auslagerung der Operationen in einen dedizierten Koprozessor
Frühe CISC-Prozessoren verfügten meist nicht über eingebaute Mechanismen zur Behandlung von Gleitkommazahlen. Gleitkommaberechnungen und mathematischen Funktionen wurden per Software durch den Hauptprozessor erledigt, was einerseits den Hauptprozessor beanspruchte und andererseits erheblich langsamer als eine spezialisierte Hardwarelösung war. Daher ging man dazu über, spezialisierte Koprozessoren zusätzlich zu implementieren. Da sie vorwiegend komplexere Operationen wie Multiplikation, Division oder Wurzelziehen und transzendente Funktionen durchführen können, werden sie auch „mathematische Koprozessoren“ genannt.
Bei CISC-Mikroprozessoren konnten die Systeme dann teilweise mit zusätzlichem Koprozessor ausgerüstet werden. Das waren z. B. von AMD der AM9511 bzw. AM9512 (lizenziert von Intel als Intel i8231 bzw. i8232), die als periphere Bausteine angesprochen wurden. Bei späteren CISC-CPUs wie den Intel x86-Prozessoren (bis zum 486er) oder den Motorola-68k-CPUs gab es die Möglichkeit, einen Koprozessor direkt auf dem Motherboard nachzurüsten. Beispiele waren die Koprozessoren von Intel 8087, 80287, 80387 und 80487. Mit fortschreitender Integration wurden die FPUs in die CPU integriert (z. B. Intel Pentium).
Eingeläutet wurde das Zeitalter der integrierten FPUs durch mehrere Faktoren:
* In CPUs integrierte Caches sind unvereinbar mit externen FPUs. Intels letzte eigenständige Gleitkommaeinheit, der externe Coprozessor i487, war daher tatsächlich eine modifizierte vollständige 80486DX-CPU. Diese hatte im Gegensatz zum 80486SX eine Gleitkommaeinheit eingebaut. Die Modifikation des Coprozessors bestand in Form eines zusätzlichen Steuerpins und einer künstlichen Sperre, die den Eigenbetrieb verhinderte. Setzte man den Coprozessor ein, so wurde die SX-CPU deaktiviert.
* Mathematische Funktionen wurden zunehmend in „normalen“ Applikationen verwendet, z. B. im Rendern von Zeichensätzen.
* Gatterfunktionen wurden zunehmend preiswerter, Sockel und Steckverbinder eher teurer.

## Funktionsweise und Aufbau

Die Anwesenheit einer FPU ermöglicht eine erhebliche Leistungssteigerung für gleitkommaintensive Berechnungen. So boten Koprozessoren breitere Register: Schon bei 16- und 32-Bit-CPUs hatte die FPU häufig 64 Bit, 80 Bit oder auch 128 Bit breite Register. Dadurch konnten einfache Berechnungen mit höherer Genauigkeit durchgeführt werden, und es wurde ein größerer Wertebereich abgedeckt. Da auch die FPU im Inneren letztendlich eine digitale Recheneinheit darstellt, bedarf es weiterer, trickreicher Methoden, um eine echte Beschleunigung zu erhalten. Viele Modelle (z. B. der 8087) verfügen über hardwareseitig optimierte Rechenmethoden wie z. B. den CORDIC-Algorithmus für trigonometrische Funktionen, welcher nur durch Addition und Registerverschiebung, aber ohne langwierige Multiplikation auskommt. Oft wird eine große Beschleunigung auch über fest implementierte Lookup-Tabellen erreicht. Das heißt, die Werte werden nicht über mehrmalige Schleifendurchläufe ermittelt, sondern zuerst mit Hilfe von Tabellen näherungsweise und dann durch Interpolationsverfahren bis zu hinreichender Genauigkeit ermittelt (Ein Fehler in einer solchen Tabelle war Ursache des sogenannten Pentium-Bug). Weiterhin kann eine FPU ihre Register oftmals als Matrix organisieren und so Vektorrechnungen beschleunigen.
Die meisten FPUs stellen Operationen für die Grundrechenarten (mit höherer Genauigkeit als die CPU), Logarithmus-, Wurzel- und Potenzrechnung und trigonometrische Funktionen sowie Funktionen für das Rechnen mit Matrizen zur Verfügung.
Die Rechenleistung einer FPU wird meistens in SPECfp gemessen, im Gegensatz zu den SPECint einer CPU.