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

  1. /*  Programm  root3.CMD                                                  */
  2. /*  zur rekursiven Berechnung der dritten Wurzel von reellen Zahlen.     */
  3.    signal on syntax name root3Msg
  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.  
  11.    bufND =Pfd||"NDZahl.DAT"
  12.    bufMsg=Pfd||"Meldung.DAT"
  13.    ND = LineIn(bufND, 1)
  14.  
  15.    arg x,y
  16.    p0p=x*x /* Diese Anweisung prvoziert eine Syntax-Fehlermeldung */
  17.  
  18.    if length(y) > 0 then
  19.    do
  20.      ret=LineOut(bufMsg, "Im Argument von  root3(...)  ist mindestens  1  nicht zulässiges Komma !")
  21.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  22.   /*  damit in den diesbezüglichen temporären Dateien                      */
  23.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  24.      EXIT
  25.    end
  26.  
  27.    if x < 1.0E-10000 | x > 1.0E+10000 then
  28.    do
  29.      ret=LineOut(bufMsg, "     Das Argument der Funktion root3(...)",
  30.                          "                                          ",
  31.                          "sollte entweder gleich  0                                                      ",
  32.                          "oder größer als  1.0E-10000  und kleiner als  1.0E+10000  sein.")
  33.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  34.      /*  damit in den diesbezüglichen temporären Dateien                      */
  35.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  36.      EXIT
  37.    end
  38.  
  39.    NUMERIC DIGITS (ND+12)
  40.    vzx=1;
  41.    if (x=0) then do; y=0; return(y); EXIT; end;
  42.    if (x<0) then
  43.    do
  44.      vzx=-1; x=abs(x);
  45.    end
  46.  
  47.    if 0<x then if x<1 then SIGNAL A
  48.  
  49.    n=0; do while x>100
  50.           x=x/1000
  51.           n=n+1
  52.         end; SIGNAL B
  53.  
  54. A: n=0; do while x<0.01
  55.           x=x*1000
  56.           n=n-1
  57.         end
  58.  
  59. B: y=1; t=x/(y*y)
  60.         do while abs(y-t) > y*10**(-ND-5)
  61.           y=(2*y+t)/3
  62.           t=x/(y*y)
  63.         end
  64.  
  65.    u=vzx*y*10**n
  66.    numeric digits ND
  67.    return(Format(u))
  68.  
  69. root3Msg:
  70.    sf=ErrorText(RC)
  71.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  72.    do
  73.      ret=LineOut(bufMsg, "Sie haben in  root3(...)  kein gültiges Argument eingegeben !")
  74.    /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  75.    /*  damit in den diesbezüglichen temporären Dateien                      */
  76.    /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  77.      EXIT
  78.    end
  79.  
  80.