home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E+,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-}
-
- (*
- C PROGRAM TO TEST DSIN/DCOS
- C
- C DATA REQUIRED
- C
- C NONE
- C
- C SUBPROGRAMS REQUIRED FROM THIS PACKAGE
- C
- C MACHAR - AN ENVIRONMENTAL INQUIRY PROGRAM PROVIDING
- C INFORMATION ON THE FLOATING-POINT ARITHMETIC
- C SYSTEM. NOTE THAT THE CALL TO MACHAR CAN
- C BE DELETED PROVIDED THE FOLLOWING FIVE
- C PARAMETERS ARE ASSIGNED THE VALUES INDICATED
- C
- C IBETA - THE RADIX OF THE FLOATING-POINT SYSTEM
- C IT - THE NUMBER OF BASE-IBETA DIGITS IN THE
- C SIGNIFICAND OF A FLOATING-POINT NUMBER
- C MINEXP - THE LARGEST IN MAGNITUDE NEGATIVE
- C INTEGER SUCH THAT DFLOAT(IBETA)**MINEXP
- C IS A POSITIVE FLOATING-POINT NUMBER
- C EPS - THE SMALLEST POSITIVE FLOATING-POINT
- C NUMBER SUCH THAT 1.0+EPS .NE. 1.0
- C EPSNEG - THE SMALLEST POSITIVE FLOATING-POINT
- C NUMBER SUCH THAT 1.0-EPSNEG .NE. 1.0
- C
- C REN(K) - A FUNCTION SUBPROGRAM RETURNING RANDOM REAL
- C NUMBERS UNIFORMLY DISTRIBUTED OVER (0,1)
- C
- C
- C STANDARD FORTRAN SUBPROGRAMS REQUIRED
- C
- C DABS, DLOG, DMAX1, DCOS, DLOAT, DSIN, DSQRT
- C
- C
- C LATEST REVISION - DECEMBER 6, 1979
- C
- C AUTHOR - W. J. CODY
- C ARGONNE NATIONAL LABORATORY
- C
- C
- *)
-
-
- function Power (X, Y: real): real;
-
- var z:real;
- iy:integer;
- reciproc:boolean;
- (* Crude power function: see Cody & Waite for a better one. *)
-
- begin (* Power *)
- if Y = 0.0 then
- Power := 1.0
- else if (X = 0.0) and (Y > 0.0) then
- Power := 0.0
- else if (Y = Int (Y)) AND (Abs(Y) <= MAXINT) THEN BEGIN
- IY := TRUNC (Y);
- reciproc := iy < 0;
- iy := abs (iy);
- z := 1.0;
- while iy > 0 do begin
- if odd(iy) then begin
- z := z*x;
-
- end else begin
- end; {endif}
- iy := iy div 2;
- if iy >0 then begin
- x := sqr (x);
- end else begin
- end; {endif}
-
- end; {endwhile}
- if reciproc then begin
- power := 1 / z;
-
- end else begin
- power := z;
- end {endif}
- end
- else if (X < 0.0) and (Y = Int(Y)) then
- if odd(trunc(Y)) then Power := -exp (Y * ln (-X))
- else Power := exp (Y * ln (-X))
- else
- Power := exp (Y * ln (X));
- end (* Power *);
-
-
- FUNCTION REN (VAR K: LONGINT): REAL;
-
- (*
- DOUBLE PRECISION FUNCTION REN(K)
- C
- C RANDOM NUMBER GENERATOR - BASED ON ALGORITHM 266 BY PIKE AND
- C HILL (MODIFIED BY HANSSON), COMMUNICATIONS OF THE ACM,
- C VOL. 8, NO. 10, OCTOBER 1965.
- C
- C THIS SUBPROGRAM IS INTENDED FOR USE ON COMPUTERS WITH
- C FIXED POINT WORDLENGTH OF AT LEAST 29 BITS. IT IS
- C BEST IF THE FLOATING POINT SIGNIFICAND HAS AT MOST
- C 29 BITS.
- C
- *)
-
- VAR J: LONGINT;
- CONST IY: LONGINT = 100001;
-
- BEGIN
- J := K;
- IY := IY * 125;
- IY := IY - (IY DIV 2796203) * 2796203;
- REN:= 1.0 * (IY) / 2796203.0e0 * (1.0e0 + 1.0e-6 + 1.0e-12);
- END;
-
-
- FUNCTION LOG (X: REAL): REAL;
- BEGIN
- LOG := LN (X) * 0.43429448190325182765;
- END;
-
-
-
- FUNCTION MAX1 (A, B:REAL): REAL;
- BEGIN
- IF A > B THEN
- MAX1 := A
- ELSE
- MAX1 := B;
- END;
-
-
- PROCEDURE MACHAR(VAR IBETA,IT,IRND,NGRD,MACHEP,NEGEP,IEXP,MINEXP,
- MAXEXP: LONGINT; VAR EPS,EPSNEG,XMIN,XMAX: REAL);
- {
- C-----------------------------------------------------------------------
- C This Fortran 77 subroutine is intended to determine the parameters
- C of the floating-point arithmetic system specified below. The
- C determination of the first three uses an extension of an algorithm
- C due to M. Malcolm, CACM 15 (1972), pp. 949-951, incorporating some,
- C but not all, of the improvements suggested by M. Gentleman and S.
- C Marovich, CACM 17 (1974), pp. 276-277. An earlier version of this
- C program was published in the book Software Manual for the
- C Elementary Functions by W. J. Cody and W. Waite, Prentice-Hall,
- C Englewood Cliffs, NJ, 1980. The present version is documented in
- C W. J. Cody, "MACHAR: A subroutine to dynamically determine machine
- C parameters," TOMS 14, December, 1988.
- C
- C The program as given here must be modified before compiling. If
- C a single (double) precision version is desired, change all
- C occurrences of CS (CD) in columns 1 and 2 to blanks.
- C
- C Parameter values reported are as follows:
- C
- C IBETA - the radix for the floating-point representation
- C IT - the number of base IBETA digits in the floating-point
- C significand
- C IRND - 0 if floating-point addition chops
- C 1 if floating-point addition rounds, but not in the
- C IEEE style
- C 2 if floating-point addition rounds in the IEEE style
- C 3 if floating-point addition chops, and there is
- C partial underflow
- C 4 if floating-point addition rounds, but not in the
- C IEEE style, and there is partial underflow
- C 5 if floating-point addition rounds in the IEEE style,
- C and there is partial underflow
- C NGRD - the number of guard digits for multiplication with
- C truncating arithmetic. It is
- C 0 if floating-point arithmetic rounds, or if it
- C truncates and only IT base IBETA digits
- C participate in the post-normalization shift of the
- C floating-point significand in multiplication;
- C 1 if floating-point arithmetic truncates and more
- C than IT base IBETA digits participate in the
- C post-normalization shift of the floating-point
- C significand in multiplication.
- C MACHEP - the largest negative integer such that
- C 1.0+FLOAT(IBETA)**MACHEP .NE. 1.0, except that
- C MACHEP is bounded below by -(IT+3)
- C NEGEPS - the largest negative integer such that
- C 1.0-FLOAT(IBETA)**NEGEPS .NE. 1.0, except that
- C NEGEPS is bounded below by -(IT+3)
- C IEXP - the number of bits (decimal places if IBETA = 10)
- C reserved for the representation of the exponent
- C (including the bias or sign) of a floating-point
- C number
- C MINEXP - the largest in magnitude negative integer such that
- C FLOAT(IBETA)**MINEXP is positive and normalized
- C MAXEXP - the smallest positive power of BETA that overflows
- C EPS - the smallest positive floating-point number such
- C that 1.0+EPS .NE. 1.0. In particular, if either
- C IBETA = 2 or IRND = 0, EPS = FLOAT(IBETA)**MACHEP.
- C Otherwise, EPS = (FLOAT(IBETA)**MACHEP)/2
- C EPSNEG - A small positive floating-point number such that
- C 1.0-EPSNEG .NE. 1.0. In particular, if IBETA = 2
- C or IRND = 0, EPSNEG = FLOAT(IBETA)**NEGEPS.
- C Otherwise, EPSNEG = (IBETA**NEGEPS)/2. Because
- C NEGEPS is bounded below by -(IT+3), EPSNEG may not
- C be the smallest number that can alter 1.0 by
- C subtraction.
- C XMIN - the smallest non-vanishing normalized floating-point
- C power of the radix, i.e., XMIN = FLOAT(IBETA)**MINEXP
- C XMAX - the largest finite floating-point number. In
- C particular XMAX = (1.0-EPSNEG)*FLOAT(IBETA)**MAXEXP
- C Note - on some machines XMAX will be only the
- C second, or perhaps third, largest number, being
- C too small by 1 or 2 units in the last digit of
- C the significand.
- C
- C Latest revision - December 4, 1987
- C
- C Author - W. J. Cody
- C Argonne National Laboratory
- C
- C-----------------------------------------------------------------------
- }
- VAR
- I,L, ITEMP,IZ,J,K,
- MX,NXRES: LONGINT;
- A,B,BETA,BETAIN,BETAH,ONE,T,TEMP,TEMPA,
- TEMP1,TWO,Y,Z,ZERO: REAL;
- CONV: ARRAY [0..10] OF REAL;
-
- LABEL 10, 20,100, 210, 220, 300, 320, 400, 410, 420, 430, 440, 450, 460, 500, 520;
-
- BEGIN
- {-----------------------------------------------------------------------}
- for l:= 1 to 10 do
- CONV [l] := l;
-
- ONE := CONV [1];
- TWO := ONE + ONE;
- ZERO := ONE - ONE;
- {-----------------------------------------------------------------------
- C Determine IBETA, BETA ala Malcolm.
- C-----------------------------------------------------------------------}
- A := ONE;
- 10: A := A + A;
- TEMP := A+ONE;
- TEMP1 := TEMP-A;
- IF (TEMP1-ONE = ZERO) THEN
- GOTO 10;
- B := ONE;
- 20: B := B + B;
- TEMP := A+B;
- ITEMP := TRUNC (TEMP-A);
- IF (ITEMP = 0) THEN
- GOTO 20;
- IBETA := ITEMP;
- BETA := CONV[IBETA];
- {-----------------------------------------------------------------------
- C Determine IT, IRND.
- C-----------------------------------------------------------------------}
- IT := 0;
- B := ONE;
- 100: IT := IT + 1;
- B := B * BETA;
- TEMP := B+ONE;
- TEMP1 := TEMP-B;
- IF (TEMP1-ONE = ZERO) THEN
- GOTO 100;
- IRND := 0;
- BETAH := BETA / TWO;
- TEMP := A+BETAH;
- IF (TEMP-A <> ZERO) THEN
- IRND := 1;
- TEMPA := A + BETA;
- TEMP := TEMPA+BETAH;
- IF ((IRND = 0) AND (TEMP-TEMPA <> ZERO))
- THEN IRND := 2;
- {-----------------------------------------------------------------------
- C Determine NEGEP, EPSNEG.
- C-----------------------------------------------------------------------}
- NEGEP := IT + 3;
- BETAIN := ONE / BETA;
- A := ONE;
- FOR I := 1 TO NEGEP DO BEGIN
- A := A * BETAIN;
- END;
- B := A;
- 210:TEMP := ONE-A;
- IF (TEMP-ONE <> ZERO) THEN
- GOTO 220;
- A := A * BETA;
- NEGEP := NEGEP - 1;
- GOTO 210;
- 220:NEGEP := -NEGEP;
- EPSNEG:= A;
- {-----------------------------------------------------------------------
- C Determine MACHEP, EPS.
- C-----------------------------------------------------------------------}
-
- MACHEP := -IT - 3;
- A := B;
- 300: TEMP := ONE+A;
- IF (TEMP-ONE <> ZERO) THEN
- GOTO 320;
- A := A * BETA;
- MACHEP := MACHEP + 1;
- GOTO 300;
- 320: EPS := A;
- {-----------------------------------------------------------------------
- C Determine NGRD.
- C-----------------------------------------------------------------------}
- NGRD := 0;
- TEMP := ONE+EPS;
- IF ((IRND = 0) AND (TEMP*ONE-ONE <> ZERO)) THEN
- NGRD := 1;
- {-----------------------------------------------------------------------
- C Determine IEXP, MINEXP, XMIN.
- C
- C Loop to determine largest I and K = 2**I such that
- C (1/BETA) ** (2**(I))
- C does not underflow.
- C Exit from loop is signaled by an underflow.
- C-----------------------------------------------------------------------}
- I := 0;
- K := 1;
- Z := BETAIN;
- T := ONE + EPS;
- NXRES := 0;
- 400: Y := Z;
- Z := Y * Y;
- {-----------------------------------------------------------------------
- C Check for underflow here.
- C-----------------------------------------------------------------------}
-
- A := Z * ONE;
- TEMP := Z * T;
- IF ((A+A = ZERO) OR (ABS(Z) >= Y)) THEN
- GOTO 410;
- TEMP1 := TEMP * BETAIN;
- IF (TEMP1*BETA = Z) THEN
- GOTO 410;
- I := I + 1;
- K := K + K;
- GOTO 400;
- 410: IF (IBETA = 10) THEN
- GOTO 420;
- IEXP := I + 1;
- MX := K + K;
- GOTO 450;
- {-----------------------------------------------------------------------
- C This segment is for decimal machines only.
- C-----------------------------------------------------------------------}
- 420: IEXP := 2;
- IZ := IBETA;
- 430: IF (K < IZ) THEN
- GOTO 440;
- IZ := IZ * IBETA;
- IEXP := IEXP + 1;
- GOTO 430;
- 440: MX := IZ + IZ - 1;
-
- {-----------------------------------------------------------------------
- C Loop to determine MINEXP, XMIN.
- C Exit from loop is signaled by an underflow.
- C-----------------------------------------------------------------------}
-
- 450: XMIN := Y;
- Y := Y * BETAIN;
- {-----------------------------------------------------------------------
- C Check for underflow here.
- C-----------------------------------------------------------------------}
- A := Y * ONE;
- TEMP := Y * T;
- IF (((A+A) = ZERO) OR (ABS(Y) >= XMIN)) THEN
- GOTO 460;
- K := K + 1;
- TEMP1 := TEMP * BETAIN;
- IF ((TEMP1*BETA <> Y) OR (TEMP = Y)) THEN
- GOTO 450
- ELSE BEGIN
- NXRES := 3;
- XMIN := Y;
- END;
- 460: MINEXP := -K;
-
- {-----------------------------------------------------------------------
- C Determine MAXEXP, XMAX.
- C-----------------------------------------------------------------------}
- IF ((MX > K+K-3) OR (IBETA = 10)) THEN
- GOTO 500;
- MX := MX + MX;
- IEXP := IEXP + 1;
- 500: MAXEXP := MX + MINEXP;
-
- {-----------------------------------------------------------------
- C Adjust IRND to reflect partial underflow.
- C-----------------------------------------------------------------}
-
- IRND := IRND + NXRES;
-
- {-----------------------------------------------------------------
- C Adjust for IEEE-style machines.
- C-----------------------------------------------------------------}
-
- IF (IRND >= 2) THEN
- MAXEXP := MAXEXP - 2;
-
- {-----------------------------------------------------------------
- C Adjust for machines with implicit leading bit in binary
- C significand, and machines with radix point at extreme
- C right of significand.
- C-----------------------------------------------------------------}
- I := MAXEXP + MINEXP;
- IF ((IBETA = 2) AND (I = 0)) THEN
- MAXEXP := MAXEXP - 1;
- IF (I > 20) THEN
- MAXEXP := MAXEXP - 1;
- IF (A <> Y) THEN
- MAXEXP := MAXEXP - 2;
- XMAX := ONE - EPSNEG;
- IF (XMAX*ONE <> XMAX) THEN
- XMAX := ONE - BETA * EPSNEG;
- XMAX := XMAX / (BETA * BETA * BETA * XMIN);
- I := MAXEXP + MINEXP + 3;
- IF (I <= 0) THEN
- GOTO 520;
- FOR L := 1 TO I DO BEGIN
- IF (IBETA = 2) THEN XMAX := XMAX + XMAX;
- IF (IBETA <>2) THEN XMAX := XMAX * BETA;
- END;
- 520:
- END;
-
-
-
- VAR
- I,IBETA,IEXP,IOUT,IRND,IT,I1,J,K1,K2,K3,MACHEP,
- MAXEXP,MINEXP,N,NEGEP,NGRD: LONGINT;
-
- A,AIT,ALBETA,B,BETA,C,DEL,EPS,EPSNEG,HALF,ONE,T,THREE,BETAP,
- TEMP,EXPON,R6,R7,TENTH,W,X,XL,XMAX,XMIN,XN,X1,Y,Z,ZERO,ZZ: REAL;
-
- LABEL 100, 110, 120, 150, 160, 210, 220, 230, 240, 300;
-
- BEGIN
- MACHAR(IBETA,IT,IRND,NGRD,MACHEP,NEGEP,IEXP,MINEXP,
- MAXEXP,EPS,EPSNEG,XMIN,XMAX);
-
- WriteLn ('MACHAR DETERMINED THE FOLLOWING PARAMETERS OF THE FLOATING-POINT ARITHEMTIC');
- WriteLn;
- WriteLn ('Radix for floating-point representation: ', IBETA);
- WriteLn ('Number of base ', IBETA:2, ' digits in significand: ', IT);
- IF IBETA <> 10 THEN
- WriteLn ('Number of bits used to represent the exponent: ', IEXP)
- ELSE
- WriteLn ('Number of decimal places used for the exponent: ', IEXP);
- WriteLn ('Smallest positive eps such that 1+eps <> 1 : ', EPS:14, ' = ', IBETA, ' ** -', ABS(MACHEP));
- WriteLn ('Smallest positive eps such that 1-eps <> 1 : ', EPSNEG:14, ' = ', IBETA, ' ** -', ABS(NEGEP));
- WriteLn ('Smallest pos. normalized floating-point number:', XMIN:14, ' = ', IBETA, ' ** -', ABS(MINEXP)) ;
- WriteLn ('Largest floating-point number: ', XMAX:14, ' = ', IBETA, ' ** +', ABS(MAXEXP), ' - 1');
- WriteLn;
- Write ('Floating-point arithmetic ');
- CASE IRND MOD 3 OF
- 0: WriteLn ('chops');
- 1: WriteLn ('rounds, but not IEEE style,');
- 2: WriteLn ('rounds IEEE style');
- END;
- IF IRND DIV 3 = 1 THEN
- WriteLn ('and supports gradual underflow')
- ELSE
- WriteLn ('and does not support gradual underflow');
-
- BETA := IBETA;
- ALBETA:= LN(BETA);
- AIT := IT;
- ONE := 1.0;
- ZERO := 0.0;
- THREE := 3.0;
- A := ZERO;
- B := 1.570796327;
- C := B;
- N := 10000;
- XN:= N;
- I1 := 0;
- {-----------------------------------------------------------------
- C RANDOM ARGUMENT ACCURACY TESTS
- C-----------------------------------------------------------------}
- FOR J := 1 TO 3 DO BEGIN
- K1 := 0;
- K3 := 0;
- X1 := ZERO;
- R6 := ZERO;
- R7 := ZERO;
- DEL:= (B - A) / XN;
- XL := A;
-
- FOR I := 1 TO N DO BEGIN
- X := DEL * REN(I1) + XL;
- Y := X / THREE;
- Y := (X + Y);
- Y := Y - X;
- X := THREE * Y;
- IF J = 3 THEN GOTO 100;
- Z := SIN(X);
- ZZ:= SIN(Y);
- W := ONE;
- IF Z <> ZERO THEN BEGIN
- TEMP := 4.0*ZZ*ZZ;
- TEMP := THREE-TEMP;
- TEMP := ZZ*TEMP;
- TEMP := Z - TEMP;
- W := TEMP / Z;
- END;
- GOTO 110;
- 100: Z := COS(X);
- ZZ := COS(Y);
- W := ONE;
- IF Z <> ZERO THEN BEGIN
- TEMP := 4.0*ZZ*ZZ;
- TEMP := THREE-TEMP;
- TEMP := ZZ*TEMP;
- TEMP := Z + TEMP;
- W := TEMP / Z;
- END;
- 110: IF W > ZERO THEN K1 := K1 + 1;
- IF W < ZERO THEN K3 := K3 + 1;
- W := ABS(W);
- IF W <= R6 THEN GOTO 120;
- R6 := W;
- X1 := X;
- 120: R7 := R7 + W * W;
- XL := XL + DEL;
- END;
-
- K2 := N - K3 - K1;
- R7 := SQRT (R7/XN);
- IF (J = 3) THEN GOTO 210;
- WriteLn;
- WriteLn;
- WriteLn ('TEST OF SIN(X) VS 3*SIN(X/3)-4*SIN(X/3)**3');
- WRITELN;
- WRITELN (N, ' RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL');
- WRITELN ('(', A, ',', B, ')');
- WRITELN;
- WRITELN ('SIN (X) WAS LARGER', K1:6, ' TIMES');
- WRITELN (' AGREED', K2:6, ' TIMES');
- WRITELN (' AND WAS SMALLER', K3:6, ' TIMES');
- GOTO 220;
- 210: WRITELN;
- WRITELN;
- WRITELN ('TEST OF COS(X) VS 4*COS(X/3)**3-3*COS(X/3)');
- WRITELN (N, ' RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL');
- WRITELN ('(', A, ',', B, ')');
- WRITELN;
- WRITELN ('COS (X) WAS LARGER', K1:6, ' TIMES');
- WRITELN (' AGREED', K2:6, ' TIMES');
- WRITELN (' AND WAS SMALLER', K3:6, ' TIMES');
- 220: WRITELN;
- WRITELN ('THERE ARE ', IT, ' BASE ', IBETA,
- ' SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER');
- WRITELN;
- W := -999.0;
- IF (R6 <> ZERO) THEN
- W := LN (ABS(R6))/ALBETA;
- WRITELN ('THE MAXIMUM RELATIVE ERROR OF ', R6:12,
- ' = ', IBETA, ' **', W:7:2);
- WRITELN ('OCCURED FOR X = ', X1);
- W := MAX1 (AIT+W,ZERO);
- WRITELN;
- WRITELN ('THE ESTIMATED LOSS OF BASE ', IBETA,
- ' SIGNIFICANT DIGITS IS ', W:7:2);
- W := -999.0;
- IF (R7 <> ZERO) THEN
- W := LN (ABS(R7))/ALBETA;
- WRITELN;
- WRITELN ('THE ROOT MEAN SQUARE RELATIVE ERROR WAS', R7:12,
- ' = ', IBETA, ' **' , W:7:2);
- W := MAX1 (AIT+W,ZERO);
- WRITELN;
- WRITELN ('THE ESTIMATED LOSS OF BASE ', IBETA,
- ' SIGNIFICANT DIGITS IS ', W:7:2);
- A := 18.84955592;
- IF (J = 2) THEN A := B + C;
- B := A + C;
- END;
-
- {-----------------------------------------------------------------
- C SPECIAL TESTS
- C-----------------------------------------------------------------}
-
- WRITELN;
- WRITELN;
- WRITELN ('SPECIAL TESTS');
- WRITELN;
- C := ONE / POWER (BETA, (IT/2));
- Z := SIN (A+C);
- Z := Z - SIN (A-C);
- TEMP := C+C;
- Z := Z / TEMP;
- WRITELN ('IF ',Z:18,' IS NOT ALMOST 1.0, SIN HAS THE WRONG PERIOD.');
-
- WRITELN;
- WRITELN;
- WRITELN ('THE IDENTITY SIN(-X) = -SIN(X) WILL BE TESTED.');
- WRITELN;
- WRITELN (' F(X) F(X)+F(-X)');
- WRITELN;
-
- FOR I := 1 TO 5 DO BEGIN
- X := REN(I1) * A;
- Z := SIN(X) + SIN(-X);
- WRITELN (X:18, Z:18);
- END;
-
- WRITELN;
- WRITELN;
- WRITELN ('THE IDENTITY SIN(X) = X , X SMALL, WILL BE TESTED.');
- WRITELN;
- WRITELN (' X X-F(X)');
- WRITELN;
- BETAP := POWER (BETA,IT);
- X := REN(I1) / BETAP;
-
- FOR I := 1 TO 5 DO BEGIN
- Z := X - SIN(X);
- WRITELN (X:18, Z:18);
- X := X / BETA;
- END;
-
- WRITELN;
- WRITELN;
- WRITELN ('THE IDENTITY COS(-X) = COS(X) WILL BE TESTED.');
- WRITELN;
- WRITELN (' X F(X)-F(-X)');
- WRITELN;
- FOR I := 1 TO 5 DO BEGIN
- X := REN (I1) * A;
- Z := COS (X) - COS (-X);
- WRITELN (X:18, Z:18);
- END;
-
- WRITELN;
- WRITELN;
- WRITELN ('TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT.');
- WRITELN;
- EXPON := MINEXP * 0.75;
- X := POWER (BETA, EXPON);
- Y := SIN(X);
- WRITELN ('SIN (', X:15, ') = ', Y:15);
- WRITELN;
- WRITELN ('THE FOLLOWING THREE LINES ILLUSTRATE THE LOSS IN SIGNIFICANCE');
- WRITELN ('FOR LARGE ARGUMENTS. THE ARGUMENTS ARE CONSECUTIVE.');
- WRITELN;
- Z := SQRT (BETAP);
- X := Z * (ONE - EPSNEG);
- Y := SIN(X);
- WRITELN ('SIN (', X:15, ') = ', Y:15);
- Y := SIN(Z);
- WRITELN ('SIN (', X:15, ') = ', Y:15);
- X := Z * (ONE + EPS);
- Y := SIN(X);
- WRITELN ('SIN (', X:15, ') = ', Y:15);
-
- {-----------------------------------------------------------------
- C TEST OF ERROR RETURNS
- C-----------------------------------------------------------------}
-
- WRITELN;
- WRITELN;
- WRITELN ('TEST OF ERROR RETURNS');
- WRITELN;
- X := BETAP;
- WRITELN ('SIN WILL BE CALLED WITH THE ARGUMENT ', X:15);
- WRITELN ('THIS SHOULD TRIGGER AN ERROR MESSAGE');
- Y := SIN(X);
- WRITELN ('SIN RETURNED THE VALUE ', Y:15);
- WRITELN ('THIS CONCLUDES THE TESTS');
- END.