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

  1. /* REXX-Funktion exp.CMD */
  2.    signal on syntax name expMsg
  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.    bufND =Pfd||"NDZahl.DAT"
  10.    NDAexp=Pfd||"NDAexp.DAT"
  11.    bufMsg=Pfd||"Meldung.DAT"
  12.    ND = LineIn(bufND, 1)
  13.  
  14.    NUMERIC DIGITS ND+10
  15.  
  16. /* An dieser Stelle muß  "bufMsg"  gelöscht werden, damit dann,   */
  17. /* die Datei  "Meldung.DAT"  leer ist, diese auch leer bleibt.    */
  18.    call charout(bufMsg)
  19.    Call SysFileDelete bufMsg
  20.  
  21.    parse UPPER arg x,y
  22.    p0p=x*x /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
  23.  
  24.    if length(y) > 0 then
  25.    do
  26.      call charout(NDAexp); Call SysFileDelete NDAexp
  27.      ret=LineOut(bufMsg, "Im Argument von  exp(...)  ist mindestens 1 nicht zulässiges Komma !")
  28.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  29.   /*  damit in den diesbezüglichen temporären Dateien                      */
  30.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  31.      EXIT
  32.    end
  33.  
  34.    if x=0 then do; u=1; signal W; end
  35.  
  36.    if abs(x) >= 1.0E+9 then
  37.    do
  38.      call charout(NDAexp); Call SysFileDelete NDAexp
  39.      ret=LineOut(bufMsg, "     Der absolute Betrag des Argumentes der Funktion exp(...)",
  40.                          "                      ",
  41.                          "darf nicht größer als  1.0E+9  sein.")
  42.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  43.   /*  damit in den diesbezüglichen temporären Dateien                      */
  44.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  45.      EXIT
  46.    end
  47.  
  48.    xg=trunc(x)
  49.    xr=x-xg
  50.    yxg=efunk(1,ND)
  51.    yxr=efunk(xr,ND)
  52.    u=yxr*yxg**xg
  53.  
  54. W: numeric digits ND
  55.    return(Format(u))
  56.  
  57. EXIT
  58.  
  59. efunk:
  60.    Procedure
  61.    arg x, ND
  62.    g=1; n=1; y=1
  63.    do forever
  64.      g=g*x/n
  65.      if abs(g/y) < 10**(-ND-10) then leave
  66.      y=y+g
  67.      n=n+1
  68.    end
  69.    return(y)
  70.  
  71. expMsg:
  72.    sf=ErrorText(RC)
  73.    if  Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
  74.    do
  75.      call charout(NDAexp); Call SysFileDelete NDAexp
  76.      ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
  77.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  78.   /*  damit in den diesbezüglichen temporären Dateien                      */
  79.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  80.      EXIT
  81.    end
  82.  
  83.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  84.    do
  85.      call charout(NDAexp); Call SysFileDelete NDAexp
  86.      ret=LineOut(bufMsg, "Sie haben in  exp(...)  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.