home *** CD-ROM | disk | FTP | other *** search
- MODULE calc;
- (*******************************************************************
- Programm zum Testen der Rechengenauigkeit Ihres Rechners.
- Es wird der folgende Funktion berechnet:
- (x+y)^2-2*x*y-y^2
- -----------------
- x^2
- Das Ergebnis müßte eigentlich 1 ergeben, aber durch Rechen-
- ungenauigkeit akkumulieren sich die Fehler zu Ergebnissen, die
- mathematisch unmöglich sind. Vor allem durch die Eingabe von
- Grenzwerten verzerrt sich das Ergebnis erheblich.
- *******************************************************************)
- FROM IO IMPORT WrLn,
- WrStr;
- FROM RealInOut IMPORT WriteReal,
- ReadReal;
- FROM Str IMPORT Caps;
- FROM InOut IMPORT Read;
-
- CONST
- MaxZahl = 50000.0; (* groessmoegliche Zahl *)
- MinZahl = -50000.0; (* kleinstmoegliche Zahl *)
-
- VAR
- x, y : REAL;
- jn:CHAR;
-
- (*******************************************************************)
- (* Procedure BERECHNUNG *)
- (*******************************************************************)
- (* Berechnet den besagten Ausdruck: *)
- (* (x+y)^2-2*x*y-y^2 *)
- (* ----------------- *)
- (* x^2 *)
- (*******************************************************************)
- PROCEDURE berechnung(x, y : REAL) : REAL;
- BEGIN
- RETURN ((x+y)*(x+y)-2.0*x*y-y*y)/(x*x);
- END berechnung;
-
-
- (*******************************************************************)
- (* Procedure LESEZAHL *)
- (*******************************************************************)
- (* Liest eine REAL-Zahl ein mit der Eigenschaft min<=zahl<=max *)
- (*******************************************************************)
- PROCEDURE lesezahl(min, max : REAL; message : ARRAY OF CHAR) : REAL;
- VAR
- z : REAL;
-
- BEGIN
- REPEAT
- WrStr(message);
- ReadReal(z);
- WrLn;
- UNTIL (z>=min) AND (z<=max);
- RETURN z;
- END lesezahl;
-
-
- (*******************************************************************)
- (* Procedure BERECHNEN *)
- (*******************************************************************)
- (* gibt eine Nachricht aus, liest x,y ein, berechnet den Ausdruck *)
- (* und gibt das Ergebnis aus. *)
- (*******************************************************************)
- PROCEDURE berechnen;
- BEGIN
- (* Nachricht ausgeben *)
- WrLn;
- WrStr('Dieses Programm berechnet nach Eingabe von x, y');
- WrLn;
- WrStr('den Ausdruck:'); WrLn;
- WrLn;
- WrStr(' (x+y)^2 - 2*x*y - y^2'); WrLn;
- WrStr(' ---------------------'); WrLn;
- WrStr(' x^2'); WrLn;
- WrLn;
- x:=lesezahl(MinZahl, MaxZahl, 'Bitte x-Wert eingeben: ');
- y:=lesezahl(MinZahl, MaxZahl, 'Bitte y-Wert eingeben: ');
- WrLn;
- WrStr('Das Ergebnis lautet: ');
- WriteReal(berechnung(x,y), 15);
- WrLn;
- WrLn;
- END berechnen;
-
-
- (*******************************************************************)
- (* Hauptprogramm *)
- (*******************************************************************)
- BEGIN
- LOOP
- berechnen;WrLn;
- WrStr('Soll die Fehlerakkumulation noch mit weiteren Zahlen getestet');
- WrLn;
- WrStr('werden ?');
- Read(jn);
- Caps(jn);
- IF jn="J" THEN WrLn;WrLn
- ELSIF jn="N" THEN EXIT
- ELSE Read(jn);
- Caps(jn)
- END; (* IF *)
- END (* LOOP *)
- END calc.
-
-