PROGRAM GLEITKOMMA (IN,OUT); CONST C=50; TYPE ZAHL=RECORD MANTISSE:INTEGER; EXPONENT:INTEGER; END; VAR ZAHL1,ZAHL2:ZAHL; FUNCTION ZEHNHOCH (X:INTEGER):INTEGER; BEGIN ZEHNHOCH:=TRUNC(EXP(X*LN(10))); END; PROCEDUR TAUSCHE (VAR ZAHL1,ZAHL2:ZAHL); VAR HILF:INTEGER; BEGIN HILF:=ZAHL1.MANTISSE;ZAHL1.MANTISSE:=ZAHL2.MANTISSE;ZAHL2.MANTISSE:=HILF; HILF:=ZAHL1.EXPONENT;ZAHL1.EXPONENT:=ZAHL2.EXPONENT;ZAHL2.EXPONENT:=HILF; END; PROCEDUR ADDIERE (VAR Z1,Z2:ZAHL); VAR EDIFF:INTEGER; SUMME:ZAHL; BEGIN IF Z2.EXPONENT>Z1.EXPONENT THEN TAUSCHE (Z1,Z2); EDIFF:=Z1.EXPONENT-Z2.EXPONENT; Z2.MANTISSE:=ROUND(Z2.MANTISSE/ZEHNHOCH(EDIFF)); Z2.EXPONENT:=Z1.EXPONENT; SUMME.MANTISSE:=Z1.MANTISSE+Z2.MANTISSE; SUMME.EXPONENT:=Z1.EXPONENT; IF SUMME.MANTISSE>ZEHNHOCH(6) THEN BEGIN SUMME.MANTISSE:=ROUND(SUMME.MANTISSE/10); SUMME.EXPONENT:=SUMME.EXPONENT+1; END; IF SUMME.EXPONENT>99 THEN WRITELN("ZAHLENBEREICH UEBERSCHRITTEN !") ELSE WRITELN("SUMME=",SUMME.MANTISSE:6,"E",SUMME.EXPONENT-C:2); END; PROCEDUR MULTIPLIZIERE (VAR Z1,Z2:ZAHL); VAR A:INTEGER; PRODUKT:ZAHL; BEGIN WRITELN("ZAHL1=",ZAHL1.MANTISSE,"E",ZAHL1.EXPONENT); WRITELN("ZAHL2=",ZAHL2.MANTISSE,"E",ZAHL2.EXPONENT); IF Z1.EXPONENT=ZEHNHOCH(6) THEN BEGIN A:=TRUNC(LN(PRODUKT.MANTISSE)/LN(10)); PRODUKT.MANTISSE:=ROUND(PRODUKT.MANTISSE/A); PRODUKT.EXPONENT:=PRODUKT.EXPONENT+A; END; IF PRODUKT.EXPONENT>99 THEN WRITELN("ZAHLBEREICH UEBERSCHRITTEN!") ELSE WRITELN("PRODUKT=",PRODUKT.MANTISSE:6,"E",PRODUKT.EXPONENT-C:2); END; (*========== Hauptprogramm ==========*) BEGIN REPEAT WRITE("ZAHL1");READLN;READ(ZAHL1.MANTISSE,ZAHL1.EXPONENT); WRITE("ZAHL2");READLN;READ(ZAHL2.MANTISSE,ZAHL2.EXPONENT); ZAHL1.EXPONENT:=ZAHL1.EXPONENT+C; ZAHL2.EXPONENT:=ZAHL2.EXPONENT+C; ADDIERE(ZAHL1,ZAHL2); MULTIPLIZIERE(ZAHL1,ZAHL2); UNTIL ZAHL1.MANTISSE=0; END.