home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / kzr_0899.zip / ARCSIN.CMD < prev    next >
OS/2 REXX Batch file  |  1998-07-11  |  4KB  |  132 lines

  1. /* REXX-Programm arcsin.cmd */
  2. /* Pi24=π/2                 */
  3.    Signal on syntax name arcsinMsg
  4.  
  5. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  6. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  7.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  8.    lp=LastPos("\", Pfd)
  9.    Pfd=DelStr(Pfd, 1+lp)
  10.    NDAarcsin=Pfd||"NDAarcsin.DAT"
  11.    bufND    =Pfd||"NDZahl.DAT"
  12.    bufMsg   =Pfd||"Meldung.DAT"
  13.    ND = LineIn(bufND, 1)
  14.  
  15.    if ND > 450 then
  16.    do
  17.      ND=450
  18.      call charout(NDAarcsin) ; Call SysFileDelete NDAarcsin
  19.      ret=LineOut(NDAarcsin, 450)
  20.      Call Charout,"   Achtung, nur 450 Dezimalstellen bei der Berechnung von  arcsin(...)"
  21.      say
  22.      Beep(444, 200); Beep(628,300)  /* Hier kein EXIT ! */
  23.    end
  24.  
  25.    /* Wenn ND <= 450 ist, wird ND = ND  weitergegeben */
  26.    call charout(NDAarcsin) ; Call SysFileDelete NDAarcsin
  27.    ret=LineOut(NDAarcsin, ND)
  28.  
  29.    Numeric Digits ND+10
  30.  
  31.    pi24=1.||,
  32.    5707963267948966192313216916397514420985846996875529104874722961539||,
  33.    082031431044993140174126710585339910740432566411533235469223047752911158||,
  34.    626797040642405587251420513509692605527798223114744774651909822144054878||,
  35.    329667230642378241168933915826356009545728242834617301743052271633241066||,
  36.    968036301245706368622935033031577940874407604604814146270458576821839462||,
  37.    951800056652652744102332606920734759707558047165286351828797959765460930||,
  38.    5869096630589655255927403723118998137478367594287636244561396909150597456
  39.  
  40.    arg xxx,y  /* y soll "illegale" Komma's im Funktions-Argument aufspüren */
  41.    p0p=xxx*xxx /* Diese Anweisung prvoziert eine Syntax-Fehlermeldung     */
  42.    vz=sign(xxx)
  43.  
  44.    if y > 0 then
  45.    do
  46.      call charout(NDAarcsin) ; Call SysFileDelete NDAarcsin
  47.      ret=LineOut(bufMsg, "Im Argument von  arcsin(...)  ist mindestens  1  nicht zulässiges Komma !")
  48.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  49.      /*  damit in den diesbezüglichen temporären Dateien                      */
  50.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  51.      EXIT
  52.    end
  53.  
  54.    xx=abs(xxx)
  55.  
  56.    if xx > 1 then
  57.    do
  58.      call charout(NDAarcsin) ; Call SysFileDelete NDAarcsin
  59.      ret=LineOut(bufMsg, "Für |x|>1 ist der Arcussinus nicht definiert !")
  60.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  61.      /*  damit in den diesbezüglichen temporären Dateien                      */
  62.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  63.      EXIT
  64.    end
  65.  
  66.    if xx=1 then do; y=pi24; Signal W; end
  67.  
  68.    /* Berechnung von x = xx/sqrt(1-xx*xx)  für |xx| <= 1 */
  69.    x=1-xx*xx
  70.    y=1
  71.    do while abs(y-x/y)>10**(-ND-7)*y
  72.      y=(y+x/y)/2
  73.    end
  74.    xx=xx/y
  75.  
  76.         /* Berechnung von arctan(x) */
  77.         if 0    <= xx & xx <  0.56 then Signal A
  78.         if 0.56 <= xx & xx <  2    then
  79.         do
  80.           x=(xx-1)/(xx+1)
  81.           Signal B
  82.         end
  83.         if xx >= 2 then Signal C
  84.  
  85.      A: /* Arctan für 0 <= xx < 0.4142 */
  86.         y=TanArc(xx,ND)
  87.         Signal W
  88.  
  89.      B: /* Arctan für 0.4142 <= x < 2.414 */
  90.         y=Pi24/2+TanArc(x,ND)
  91.         Signal W
  92.  
  93.      C: /* Arctan für x > 2.414 */
  94.         t=xx**2; v=1; m=2; g=1
  95.         do forever
  96.           g=-g*(m-1)/(t*(m+1))
  97.           v=v+g
  98.           if abs(g/v) < 10**(-ND-7) then leave
  99.           m=m+2
  100.         end
  101.         y=1*pi24-v/xx
  102.  
  103. W: Numeric Digits ND
  104.    Return(Format(vz*y))
  105.  
  106. EXIT
  107.  
  108. TanArc:
  109.    Procedure
  110.    arg x,ND
  111.    t=x**2; g=1; u=1; v=1; m=2
  112.    do forever
  113.      g=-t*g*(m-1)/(m+1)
  114.      v=v+g
  115.      if abs(g/v) < 10**(-ND-5 ) then leave
  116.      m=m+2
  117.    end
  118.    return(x*v)
  119.  
  120. arcsinMsg:
  121.    sf=ErrorText(RC)
  122.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  123.    do
  124.      call charout(NDAarcsin) ; Call SysFileDelete NDAarcsin
  125.      ret=LineOut(bufMsg, "Sie haben in  arcsin(...)  kein gültiges Argument eingegeben !")
  126.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  127.   /*  damit in den diesbezüglichen temporären Dateien                      */
  128.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  129.      EXIT
  130.    end
  131.  
  132.