home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / kmpl9803.zip / 0_cos.cmd < prev    next >
OS/2 REXX Batch file  |  1998-02-14  |  2KB  |  64 lines

  1. /* REXX-Programm 0_cos.cmd */
  2.  
  3.    arg xx,ND
  4.    /* Wegen der Periodizität der Cosinusfunktion hohe Genauigkeit */
  5.    Numeric Digits ND+40
  6.  
  7.    if xx = 0 then do; y=1; Signal W; end
  8.    if abs(xx)>=1.0E8 then signal VW 
  9.    
  10.    pi=3.||,
  11.    1415926535897932384626433832795028841971693993751058209749445923078||,
  12.    164062862089986280348253421170679821480865132823066470938446095505822317
  13.    pi14=pi/4;
  14.  
  15.    /* x bleibt im Intervall  0 < x < 2*pi  */
  16.    x=abs(xx)//(2*pi)
  17.  
  18.    vz=1
  19.    /* Das Intervall  0 < x < 2*pi  wird so zerlegt, daß die Reihen für     */
  20.    /* sin(x)  und  cos(x)  immer nur für Werte  x < π/4  verwendet werden. */
  21.    select
  22.      when x > 7*pi14 then do; x = 2*pi-x;   vz=+1; Signal Cos; end
  23.      when x > 6*pi14 then do; x = x-3*pi/2; vz=+1; Signal Sin; end
  24.      when x > 5*pi14 then do; x = 3*pi/2-x; vz=-1; Signal Sin; end
  25.      when x > 4*pi14 then do; x = x-pi;     vz=-1; Signal Cos; end
  26.      when x > 3*pi14 then do; x = pi-x;     vz=-1; Signal Cos; end
  27.      when x > 2*pi14 then do; x = x-pi/2;   vz=-1; Signal Sin; end
  28.      when x >   pi14 then do; x = pi/2-x;   vz=+1; Signal Sin; end
  29.      when x >   0    then do; x = x;        vz=+1; Signal Cos; end
  30.      otherwise NOP
  31.    end
  32.  
  33. Sin:
  34.    /* Reihe sin(x) */
  35.    g=1; z=x**2 ; m=2; v=1
  36.    do forever
  37.      g=-g*z/(m*(m+1))
  38.      if abs(g/v) < 10**(-ND-30) then leave
  39.      v=v+g
  40.      m=m+2
  41.    end
  42.    y=v*x*vz
  43.    Signal W
  44.  
  45. Cos:
  46.    /* Reihe cos(x) */
  47.    g=1; z=x**2; m=2; v=1
  48.    do forever
  49.      g=-g*z/(m*(m-1))
  50.      if (abs(g/v) < 10**(-ND-30)) then leave
  51.      v=v+g
  52.      m=m+2
  53.    end
  54.    y=v*vz
  55.  
  56. W: numeric digits ND+5
  57.    return(Format(y))
  58.  
  59. EXIT
  60.  
  61. vW:
  62.    return(NULL)
  63.    EXIT
  64.