home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / calculat / pibcal11.zip / ARITH.PAS next >
Pascal/Delphi Source File  |  1985-03-11  |  8KB  |  269 lines

  1. (*--------------------------------------------------------------------------*)
  2. (*                  ARITH.PAS --- basic arithmetic routines                 *)
  3. (*--------------------------------------------------------------------------*)
  4. (*                                                                          *)
  5. (*    Routines included:                                                    *)
  6. (*                                                                          *)
  7. (*       AddVals  --- add two values                                        *)
  8. (*       SubVals  --- subtract two values                                   *)
  9. (*       MulVals  --- multiply two values                                   *)
  10. (*       DivVals  --- divide two real values                                *)
  11. (*       IdivVals --- Integer divide                                        *)
  12. (*       ModVals  --- MOD operation                                         *)
  13. (*       PowVals  --- exponentiation operation                              *)
  14. (*                                                                          *)
  15. (*--------------------------------------------------------------------------*)
  16.  
  17.  
  18. (*--------------------------------------------------------------------------*)
  19. (*                     AddVals --- Add two values                           *)
  20. (*--------------------------------------------------------------------------*)
  21.  
  22. PROCEDURE AddVals( VAR a , b : valuety );
  23.  
  24. VAR
  25.    k: INTEGER;
  26.  
  27. BEGIN (* AddVals *)
  28.  
  29.    WITH a DO
  30.                                    (* Integer result *)
  31.  
  32.       IF ( typ = INT ) AND ( b.typ = INT ) THEN
  33.          BEGIN
  34.             i := i + b.i;
  35.             k := i;
  36.             r := k;
  37.          END
  38.       ELSE                         (* Real result *)
  39.          BEGIN
  40.             i   := 0;
  41.             r   := r + b.r;
  42.             typ := rea;
  43.          END
  44.  
  45. END  (* AddVals *);
  46.  
  47. (*--------------------------------------------------------------------------*)
  48. (*                    SubVals --- Subtract two values                       *)
  49. (*--------------------------------------------------------------------------*)
  50.  
  51. PROCEDURE SubVals( VAR a , b : valuety );
  52.  
  53. VAR
  54.    k: INTEGER;
  55.  
  56. BEGIN  (* SubVals *)
  57.  
  58.    WITH a DO
  59.       IF ( typ = INT ) AND ( b.typ = INT ) THEN
  60.  
  61.          BEGIN                     (* Integer result *)
  62.             i := i - b.i;
  63.             k := i;
  64.             r := k;
  65.          END
  66.       ELSE
  67.          BEGIN                     (* Real result *)
  68.             i   := 0;
  69.             r   := r - b.r;
  70.             typ := rea;
  71.          END;
  72.  
  73. END   (* SubVals *);
  74.  
  75. (*--------------------------------------------------------------------------*)
  76. (*                    MulVals --- Multiply two values                       *)
  77. (*--------------------------------------------------------------------------*)
  78.  
  79. PROCEDURE MulVals( VAR a , b : valuety );
  80.  
  81. VAR
  82.    k: INTEGER;
  83.  
  84. BEGIN  (* MulVals *)
  85.  
  86.    WITH a DO
  87.       IF ( typ = INT ) AND ( b.typ = INT ) THEN
  88.  
  89.          BEGIN                     (* Integer result *)
  90.             i := i * b.i;
  91.             k := i;
  92.             r := k;
  93.          END
  94.       ELSE
  95.          BEGIN                     (* Real result *)
  96.             i   := 0;
  97.             r   := r * b.r;
  98.             typ := rea;
  99.          END;
  100.  
  101. END   (* MulVals *);
  102.  
  103. (*--------------------------------------------------------------------------*)
  104. (*                   RdivVals --- Divide two values (real division)         *)
  105. (*--------------------------------------------------------------------------*)
  106.  
  107. PROCEDURE RdivVals( VAR a , b : valuety );
  108.  
  109. BEGIN  (* RdivVals *)
  110.  
  111.    WITH a DO
  112.       BEGIN
  113.                                    (* Issue error on zero divide *)
  114.          IF b.r = 0.0 THEN
  115.             Error('Division by zero')
  116.          ELSE
  117.             BEGIN
  118.                i   := 0;
  119.                r   := r / b.r;
  120.                typ := rea;
  121.             END;
  122.  
  123.       END;
  124.  
  125. END  (* RdivVals *);
  126.  
  127. (*--------------------------------------------------------------------------*)
  128. (*               IdivVals --- Divide two values (integer division)          *)
  129. (*--------------------------------------------------------------------------*)
  130.  
  131. PROCEDURE IdivVals( VAR a , b : valuety );
  132.  
  133. VAR
  134.    k: INTEGER;
  135.  
  136. BEGIN (* IdivVals *)
  137.  
  138.    WITH a DO
  139.       BEGIN
  140.                                    (* Ensure both operands are integers *)
  141.  
  142.          IF ( typ <> INT ) OR ( b.typ <> INT ) THEN
  143.             Error('DIV operands must both be integers')
  144.          ELSE
  145.             BEGIN                  (* Check for zero divide *)
  146.                IF b.i = 0 THEN
  147.                   Error ('Division by zero')
  148.                ELSE
  149.                   BEGIN
  150.  
  151.                      i := i DIV b.i;
  152.                      k := i;
  153.                      r := k;
  154.  
  155.                   END;
  156.  
  157.             END;
  158.  
  159.       END;
  160.  
  161. END  (* IdivVals *);
  162.  
  163. (*--------------------------------------------------------------------------*)
  164. (*                      ModVals --- MOD operation                           *)
  165. (*--------------------------------------------------------------------------*)
  166.  
  167. PROCEDURE ModVals( VAR a , b : valuety );
  168.  
  169. VAR
  170.    k: INTEGER;
  171.  
  172. BEGIN (* ModVals *)
  173.  
  174.    WITH a DO
  175.       BEGIN
  176.                                    (* Ensure both operands are integers *)
  177.  
  178.          IF ( typ <> INT ) OR ( b.typ <> INT ) THEN
  179.             Error('MOD operands must both be integers')
  180.  
  181.          ELSE                      (* Don't allow MOD 0 *)
  182.             BEGIN
  183.                IF b.i = 0 THEN
  184.                   error ('MOD 0 illegal')
  185.                ELSE
  186.                   BEGIN
  187.  
  188.                      i := i MOD b.i;
  189.                      k := i;
  190.                      r := k;
  191.  
  192.                   END;
  193.  
  194.            END;
  195.  
  196.       END;
  197.  
  198. END  (* ModVals *);
  199.  
  200. (*--------------------------------------------------------------------------*)
  201. (*                   PowVals --- exponentiation operation                   *)
  202. (*--------------------------------------------------------------------------*)
  203.  
  204. PROCEDURE PowVals( VAR a , b : valuety );
  205.  
  206. VAR
  207.    k: INTEGER;
  208.  
  209. BEGIN (* PowVals *)
  210.  
  211.    WITH a DO
  212.       BEGIN
  213.  
  214.          i := 0;
  215.  
  216.          CASE b.typ OF
  217.                                    (* Power is integer *)
  218.             INT: BEGIN
  219.                                    (* Don't allow 0 ** (<= 0) *)
  220.  
  221.                     IF ( r = 0.0 ) AND ( b.i <= 0 ) THEN
  222.                        Error('Bad arguments for exponentiation')
  223.                     ELSE
  224.                        BEGIN
  225.  
  226.                           r := PowerI( r , b.i );
  227.  
  228.                                    (* Round if integer result required *)
  229.  
  230.                           IF ( typ = INT ) AND ( b.i >= 0 ) THEN
  231.                              BEGIN
  232.                                 i := ROUND(r);
  233.                                 k := i;
  234.                                 r := k;
  235.                              END
  236.                           ELSE
  237.                              typ := rea;
  238.  
  239.                        END;
  240.  
  241.                  END;
  242.                                    (* Real exponent *)
  243.  
  244.             rea: BEGIN  (* REA *)
  245.  
  246.                                    (* Don't allow 0 ** ( <= 0 ), or *)
  247.                                    (* (<= 0) ** ( <= 0 )            *)
  248.  
  249.                     IF r < 0.0 THEN
  250.                        Error('Bad arguments for exponentiation')
  251.                     ELSE IF ( r = 0.0 ) AND ( b.r <= 0.0 ) THEN
  252.                        Error('Bad arguments for exponentiation')
  253.                     ELSE
  254.                        BEGIN
  255.  
  256.                           r   := Power( r , b.r );
  257.                           typ := rea;
  258.  
  259.                        END (* IF *);
  260.  
  261.                  END  (* REA *)
  262.  
  263.          END  (*  CASE *)
  264.  
  265.    END  (* WITH *)
  266.  
  267. END (* PowVals *);
  268.  
  269.