home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
modula3
/
calc.mod
< prev
next >
Wrap
Text File
|
1993-07-28
|
4KB
|
109 lines
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.