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

  1. /* REXX-Programm artanh.CMD  */
  2.    Signal on syntax name artanhMsg
  3.  
  4. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  5. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  6.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  7.    lp=LastPos("\", Pfd)
  8.    Pfd=DelStr(Pfd, 1+lp)
  9.    NDAartanh=Pfd||"NDAartanh.DAT"
  10.    bufND  =Pfd||"NDZahl.DAT"
  11.    bufMsg =Pfd||"Meldung.DAT"
  12.    ND = LineIn(bufND, 1)
  13.  
  14.    if ND > 400 then
  15.    do
  16.      ND=400
  17.      call charout(NDAartanh) ; Call SysFileDelete NDAartanh
  18.      ret=LineOut(NDAartanh, 400)
  19.      Call Charout,"   Achtung, nur 400 Dezimalstellen bei der Berechnung von  artanh(...)"
  20.      say
  21.      Beep(444, 200); Beep(628,300)  /* Hier kein EXIT ! */
  22.    end
  23.  
  24.    /* Wenn ND <= 400 ist, wird ND = ND  weitergegeben */
  25.    call charout(NDAartanh) ; Call SysFileDelete NDAartanh
  26.    ret=LineOut(NDAartanh, ND)
  27.  
  28.    arg x,y  /* y soll "illegale" Komma's im Funktions-Argument aufspüren */
  29.    p0p=x*x  /* Diese Anweisung prvoziert eine Syntax-Fehlermeldung       */
  30.  
  31.    if length(y) > 0 then
  32.    do
  33.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  34.      ret=LineOut(bufMsg, "Im Argument von  artanh(...)  ist mindestens  1  nicht zulässiges Komma !")
  35.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  36.      /*  damit in den diesbezüglichen temporären Dateien                      */
  37.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  38.      EXIT
  39.    end
  40.  
  41.    Numeric Digits ND+4
  42.  
  43.    if abs(x) = 1 then
  44.    do
  45.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  46.      ret=LineOut(bufMsg, "Für  |x| = 1  ist  |artanh(x)| = unendlich groß !")
  47.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  48.      /*  damit in den diesbezüglichen temporären Dateien                      */
  49.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  50.      EXIT
  51.    end
  52.  
  53.    if abs(x) > 1 then
  54.    do
  55.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  56.      ret=LineOut(bufMsg, "Für  |x| > 1  hat  artanh(x)  kein reelles Ergebnis !")
  57.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  58.      /*  damit in den diesbezüglichen temporären Dateien                      */
  59.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  60.      EXIT
  61.    end
  62.  
  63.    if abs(x) >  0.3 then Signal B
  64.  
  65. A: m=2; g=1; v=1; t=x*x
  66.    do forever
  67.      g=g*t*(m-1)/(m+1)
  68.      v=v+g
  69.      if g/v < 10**(-ND-4) then leave
  70.      m=m+2
  71.    end
  72.    y=x*v
  73.    Signal W
  74.  
  75. B: y=ln(sqrt((1+x)/(1-x)))
  76.  
  77.    /* Ausgabe */
  78. W: numeric digits ND
  79.    return(Format(y))
  80.  
  81. artanhMsg:
  82.    sf=ErrorText(RC)
  83.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  84.    do
  85.      call charout(NDAartanh); Call SysFileDelete NDAartanh
  86.      ret=LineOut(bufMsg, "Sie haben in  artanh(...)  kein gültiges Argument eingegeben !")
  87.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  88.   /*  damit in den diesbezüglichen temporären Dateien                      */
  89.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  90.      EXIT
  91.    end
  92.  
  93.