home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / BPL70N12.ZIP / TESTPRGS.ZIP / FUN1_TST.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-03-07  |  7.0 KB  |  240 lines

  1. PROGRAM Fun1_Test;  { Copyright (c) 1988-1993 Norbert Juffa }
  2.  
  3. { Fun1_Test tests the basic arithmetic operations of the REAL arithmetic
  4.   software routines against the coprocessor }
  5.  
  6. {$A+,B-,D+,E+,F-,I-,L-,N+,O-,R-,S-,V-}
  7. {$M 16384,0,655360}
  8.  
  9. USES Math, Fun1_TP6;
  10.  
  11. VAR  RandomNr:   ARRAY [0..10760] OF REAL;
  12.      R, R2:      REAL;
  13.      X, Y,
  14.      MaxY:       EXTENDED;
  15.      I, J, L,
  16.      ErrCountY:  LONGINT;
  17.  
  18. CONST
  19.     {$IFDEF VER40}
  20.     Ver = '4.0';
  21.     {$ENDIF}
  22.     {$IFDEF VER50}
  23.     Ver = '5.0';
  24.     {$ENDIF}
  25.     {$IFDEF VER55}
  26.     Ver = '5.5';
  27.     {$ENDIF}
  28.     {$IFDEF VER60}
  29.     Ver = '6.0';
  30.     {$ENDIF}
  31.     {$IFDEF VER70}
  32.     Ver = '7.0';
  33.     {$ENDIF}
  34.  
  35.  
  36. BEGIN
  37.    WriteLn;
  38.    WriteLn ('Testing for errors in the basic arithmetic operations of TP '+Ver);
  39.    WriteLn;
  40.    WriteLn ('There should be no errors reported and relative error should be below');
  41.    WriteLn (PowerOfTwo (-40), ' for all functions that are tested. The test ');
  42.    WriteLn ('will take some time to complete, especially when using the emulator.');
  43.    WriteLn ('─────────────────────────────────────────────────────────────────────');
  44.    RandSeed := 12345;
  45.    FOR L := 0 TO 10760 DO BEGIN
  46.       RandomNr [L] := Exp (Random * 87);
  47.    END;
  48.    ErrCountY := 0;
  49.    MaxY := 0;
  50.    FOR L := 1 TO 10000000 DO BEGIN
  51.       X := RandomNr [L MOD 10739] + RandomNr [(L + 101) MOD 10753];
  52.       Y := Add_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  53.       R := X;
  54.       R2:= Y;
  55.       IF (X <> Y) THEN BEGIN
  56.          IF Abs ((Y-X) / X) > MaxY THEN
  57.             MaxY := Abs ((Y-X) / X);
  58.          IF (R <> R2) THEN
  59.             Inc (ErrCountY);
  60.          END;
  61.    END;
  62.    WriteLn ('errors in addition:');
  63.    WriteLn;
  64.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  65.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  66.    WriteLn;
  67.    WriteLn;
  68.    MaxY := 0;
  69.    ErrCountY := 0;
  70.    FOR L := 1 TO 10000000 DO BEGIN
  71.       X := RandomNr [L MOD 10739] - RandomNr [(L + 101) MOD 10753];
  72.       Y := Add_TP60 (RandomNr [L MOD 10739], -(RandomNr [(L + 101) MOD 10753]));
  73.       R := X;
  74.       R2:= Y;
  75.       IF (X <> Y) THEN BEGIN
  76.          IF Abs ((Y-X) / X) > MaxY THEN
  77.             MaxY := Abs ((Y-X) / X);
  78.          IF (R <> R2) THEN
  79.             Inc (ErrCountY);
  80.          END;
  81.    END;
  82.    WriteLn ('errors in subtraction: ');
  83.    WriteLn;
  84.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  85.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  86.    WriteLn;
  87.    WriteLn;
  88.  
  89.    FOR L := 0 TO 10760 DO BEGIN
  90.       RandomNr [L] := Exp (Random * 43) * (Random - 1);
  91.       IF RandomNr [L] = 0 THEN
  92.          RandomNr[L] := 0.1;
  93.    END;
  94.    MaxY := 0;
  95.    ErrCountY := 0;
  96.    FOR L := 1 TO 100 DO BEGIN
  97.       X := RandomNr [L MOD 10739] * RandomNr [(L + 101) MOD 10753];
  98.       Y := Mul_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  99.       R := X;
  100.       R2:= Y;
  101.       IF (X <> Y) THEN BEGIN
  102.          IF Abs ((Y-X) / X) > MaxY THEN
  103.             MaxY := Abs ((Y-X) / X);
  104.          IF (R <> R2) THEN
  105.             Inc (ErrCountY);
  106.          END;
  107.    END;
  108.    WriteLn ('errors in multiplication: ');
  109.    WriteLn;
  110.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  111.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  112.  
  113.    WriteLn;
  114.    WriteLn;
  115.    MaxY := 0;
  116.    ErrCountY := 0;
  117.    FOR L := 1 TO 10760 DO BEGIN
  118.       X := Sqr (RandomNr [L]);
  119.       Y := Sqr_TP60 (RandomNr [L]);
  120.       R := X;
  121.       R2:= Y;
  122.       IF (X <> Y) THEN BEGIN
  123.          IF Abs ((Y-X) / X) > MaxY THEN
  124.             MaxY := Abs ((Y-X) / X);
  125.          IF (R <> R2) THEN
  126.             Inc (ErrCountY);
  127.          END;
  128.    END;
  129.    WriteLn ('errors in squaring: ');
  130.    WriteLn;
  131.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  132.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  133.    WriteLn;
  134.    WriteLn;
  135.    MaxY := 0;
  136.    ErrCountY := 0;
  137.    FOR L := 1 TO 10000000 DO BEGIN
  138.       X := RandomNr [L MOD 10739] * Abs (Trunc (RandomNr [(L + 101) MOD 10753] / 8e13));
  139.       Y := Mul_TP60 (RandomNr [L MOD 10739], Abs (Trunc (RandomNr [(L + 101) MOD 10753]/8e13)));
  140.       R := X;
  141.       R2:= Y;
  142.       IF (X <> Y) THEN BEGIN
  143.          IF Abs ((Y-X) / X) > MaxY THEN begin
  144.             MaxY := Abs ((Y-X) / X);
  145.             end;
  146.          IF (R <> R2) THEN
  147.             Inc (ErrCountY);
  148.          END;
  149.    END;
  150.    WriteLn ('errors in SHORT-multiplication: ');
  151.    WriteLn;
  152.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  153.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  154.    WriteLn;
  155.    WriteLn;
  156.    MaxY := 0;
  157.    ErrCountY := 0;
  158.    FOR L := 1 TO 10760 DO BEGIN
  159.       X := Sqr (1.0*Trunc(RandomNr [L] / 8e13+1));
  160.       Y := Sqr_TP60 (Trunc(RandomNr [L] / 8e13+1));
  161.       R := X;
  162.       R2:= Y;
  163.       IF (X <> Y) and (X <> 0) THEN BEGIN
  164.          IF Abs ((Y-X) / X) > MaxY THEN
  165.             MaxY := Abs ((Y-X) / X);
  166.          IF (R <> R2) THEN
  167.             Inc (ErrCountY);
  168.          END;
  169.    END;
  170.    WriteLn ('errors in squaring (Short): ');
  171.    WriteLn;
  172.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  173.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  174.    WriteLn;
  175.    WriteLn;
  176.    MaxY := 0;
  177.    ErrCountY := 0;
  178.    FOR L := 1 TO 10000000 DO BEGIN
  179.       X := RandomNr [L MOD 10739] / RandomNr [(L + 101) MOD 10753];
  180.       Y := Div_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  181.       R := X;
  182.       R2:= Y;
  183.       IF (X <> Y) THEN BEGIN
  184.          IF Abs ((Y-X) / X) > MaxY THEN
  185.             MaxY := Abs ((Y-X) / X);
  186.          IF (R <> R2) THEN
  187.             Inc (ErrCountY);
  188.          END;
  189.    END;
  190.    WriteLn ('errors in division: ');
  191.    WriteLn;
  192.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  193.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  194.    WriteLn;
  195.    halt;
  196.    WriteLn;
  197.    MaxY := 0;
  198.    ErrCountY := 0;
  199.    FOR L := 1 TO 10760 DO BEGIN
  200.       X := Int (RandomNr [L]) + Frac (RandomNr [L]);
  201.       Y := Int_TP60 (RandomNr [L]) + Frac_TP60 (RandomNr [L]);
  202.       R := X;
  203.       R2:= Y;
  204.       IF (X <> Y) THEN BEGIN
  205.          IF Abs ((Y-X) / X) > MaxY THEN
  206.             MaxY := Abs ((Y-X) / X);
  207.          IF (R <> R2) THEN
  208.             Inc (ErrCountY);
  209.          END;
  210.    END;
  211.    WriteLn ('errors in Int / Frac: ');
  212.    WriteLn;
  213.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  214.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  215.    WriteLn;
  216.    WriteLn;
  217.    MaxY := 0;
  218.    ErrCountY := 0;
  219.    FOR L := 1 TO 10760 DO BEGIN
  220.       RandomNr [L] := RandomNr [L] /2.5e9;
  221.       X := Trunc (RandomNr [L]);
  222.       Y := Float_TP60 (Trunc_TP60 (RandomNr [L]));
  223.       R := X;
  224.       R2:= Y;
  225.       IF (X <> Y) THEN BEGIN
  226.          IF Abs ((Y-X) / X) > MaxY THEN
  227.             MaxY := Abs ((Y-X) / X);
  228.          IF (R <> R2) THEN
  229.             Inc (ErrCountY);
  230.          END;
  231.    END;
  232.    WriteLn ('errors in Trunc / Float: ');
  233.    WriteLn;
  234.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  235.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  236.    WriteLn;
  237. END.
  238. begin { Fun1_Test }
  239. end. { Fun1_Test }
  240.