Programmiersprache Pascal

Numerische Effekte - Fall 7

Probleme bereitet bei Berechnungen mit reellwertigen Variablen der Test auf Gleichheit:
Nicht alles, was nach den Gesetzen der "normalen" Arithmetik gleich ist, ist auch nach Ausführung von Operationen mit der Computerarithmetik gleich.

Beispiel (Turbo Pascal):

  PROGRAM real_eq;
  {$N+}

  VAR s : SINGLE;            { einfache Genauigkeit }
      d : DOUBLE;            { doppelte Genauigkeit }

  BEGIN
    s := 1 / 3;
    d := 1 / 3;
    IF s = d THEN
      Writeln(s, ' = ', d)
    ELSE
      Writeln(s, ' <> ', d);
    Writeln(s = 1 / 3, ' ', d = 1 / 3);
  END.
Testergebnis
   3.33333343267441E-0001 <>  3.33333333333333E-0001
  FALSE FALSE
Bemerkung:
Reellwertige Berechnungen werden intern mit erweiterter Genauigkeit (EXTENDED) ausgeführt.

Wird das Programm um die folgenden Deklarationsanweisungen ergänzt, so ist es auch unter Gnu Pascal lauffähig:

  TYPE SINGLE = __short__ REAL;       { einfache Genauigkeit }
       DOUBLE = REAL;                 { doppelte Genauigkeit }
Testergebnisse:
   3.3333334e-01 <>  3.3333333e-01
   False   True
Bemerkung:
Reellwertige Berechnungen werden intern mit doppelter Genauigkeit (REAL) ausgeführt.


Wird im obigen Beispiel 1 / 3 durch 1 / 2 ersetzt, so ergibt sich unter Turbo Pascal folgendes Testergebnis:

   5.00000000000000E-0001 =  5.00000000000000E-0001
  TRUE TRUE
Da 1 / 2 als Zweierpotenz 2-1 rechnerintern exakt darstellbar ist, gelingt hier der Test auf Gleichheit.



P. Böhme, 27.09.1996