|
4.3.1.3 Reelwertige Typen
Ein reeller Typ definiert eine Menge von Werten, die Näherungen für
einen Ausschnitt aus der Menge der reellen Zahlen sind. Zahlen werden binär
gespeichert. Da eine Implementierung nur eine endliche Anzahl von Bits für
Zahlen zur Verfügung stellen kann, ist es unmöglich, jede reelle Zahl
exakt im Rechner darzustellen. Die dadurch entstehende Ungenauigkeit wird als
Rundungsfehler bezeichnet.
Rundungsfehler sind ein ernstes Problem vor allem in Programmen für eingebettete
Systeme (z.B. Autopilot, Kraftwerkssteuerung).
Bei der Berechnung komplexer Algorithmen können sich kleine Abweichungen
zu nicht vernachlässigbaren Fehlern akkumulieren. Damit Ada auch für
numerische Berechnungen hohe Zuverlässigkeit bieten kann, wird für reelle
Typen eine minimale Genauigkeit festgelegt.
Die Genauigkeit wird durch die Deklaration des Gleit- oder Festpunkttyps festgelegt
und ist daher unabhängig von der Zielhardware. Das erleichtert es, Programme
zu schreiben, die mit einer garantierten Minimalgenauigkeit auf jeder Maschine
laufen, für die das Programm übersetzt werden kann. Der Ada-Übersetzer
versucht, die geforderte Genauigkeit auf die Zielhardware abzubilden. Ist die
geforderte Genauigkeit nicht zu implementieren, führt dies zu einem Übersetzungsfehler.
In Ada besteht die Möglichkeit, reellwertige Datentypen selbst zu definieren.
Hier wurde den Schwierigkeiten der Portierung numerischer Software Rechnung getragen,
indem durch Einführung von Modellzahlen Mindestanforderungen an die Genauigkeit
von reellwertigen Zahldarstellungen gestellt werden können.
Aufgrund der approximativen Darstellung sind beim Arbeiten mit reellwertigen Daten
zwei Fehlerarten zu unterscheiden (x bezeichnet die tatsächliche Zahl und
xd die endliche Darstellung):
- absolute Fehler - die absolute Abweichung der Darstellung von der tatsächlichen
Zahl
- relative Fehler - die Abweichung der Darstellung von der tatsächlichen
Zahl in Relation zur Größe der Zahl
Beispiel:
Ada stellt entsprechend zwei verschiedene Klassen von Datentypen mit reellwertigen
Wertebereichen zur Verfügung:
Gleit- und Festpunkttypen. Reellwertige Literale sind vom anonymen Typ universal_real.
Gleit- und Festpunkttypen haben zwar keine eigenen Literale, jedoch werden die
reellwertigen Literale implizit konvertiert.
- Folgende Operationen sind für Gleitpunkt- und Festpunkttypen vordefiniert:
- explizite Typumwandlung
- Qualifizierung
- Zuweisung
- relational e Operationen (=, /=, <, <=, >, >=)
- mathematische Grundopertionen (+, -, *, /)
- Zugehörigkeitsoperation (not in)
- Exponentiation (**)
Bei der Exponentiation ist zu beachten, dass der Exponend immer ganzzahlig
sein muss.
Beispiel:
....
type DEUTSCHE_MARK is new INTEGER;
X : INTEGER;
Mark : DEUTSCHE_MARK;
F : FLOAT;
Betrag : FLOAT := 50.50;
...
begin
F := FLOAT(X); --
Explizite typumwandlung
Mark := DEUTSCHE_MARK(Betrag); -- Explizite
typumwandlung
if X**2 not in 0.0 .. 10.0 then
Put("Quadrat X is nicht enthalten");
end if;
...
|
|