Annotation of researchv10dc/cmd/icon/ipl/source/math.icn, revision 1.1

1.1     ! root        1: #      MATH
        !             2: #      
        !             3: #      Mathematical procedures
        !             4: #
        !             5: #      George D. Yee
        !             6: #      1847 N. Frances Blvd.
        !             7: #      Tucson, AZ  85712
        !             8: #
        !             9: #      Last modified 5/6/86 by Ralph E. Griswold
        !            10: #
        !            11: #
        !            12: #    Free distribution and use of this material is granted provided the
        !            13: #    above credit is left intact on all source copies.  No warranties
        !            14: #    are made as to the correctness or suitability of these procedures
        !            15: #    for any purpose.  Please send any suggestions to the author at the above
        !            16: #    address.
        !            17: #
        !            18: 
        !            19: procedure sin(x)
        !            20:    return _sinus(numeric(x),0)
        !            21: end
        !            22: 
        !            23: procedure cos(x)
        !            24:    return _sinus(abs(numeric(x)),1)
        !            25: end
        !            26: 
        !            27: procedure tan(x)
        !            28:    return sin(x) / (0.0 ~= cos(x))
        !            29: end
        !            30: 
        !            31: # atan returns the value of the arctangent of its
        !            32: # argument in the range [-pi/2,pi/2].
        !            33: procedure atan(x)
        !            34:    if numeric(x) then
        !            35:       return if x > 0.0 then _satan(x) else -_satan(-x)
        !            36: end
        !            37: 
        !            38: # atan2 returns the arctangent of y/x
        !            39: # in the range [-pi,pi].
        !            40: procedure atan2(y,x)
        !            41:    local r
        !            42:    static pi
        !            43:    initial pi := 3.141592653589793238462643
        !            44:    return if numeric(y) & numeric(x) then {
        !            45:       if x > 0.0 then
        !            46:          atan(y/x)
        !            47:       else if x < 0.0 then {
        !            48:          r := pi - atan(abs(y/x))
        !            49:          if y >= 0.0 then r else -r
        !            50:          }
        !            51:       else if x = y = 0.0 then
        !            52:          0.0         # special value if both x and y are zero
        !            53:       else
        !            54:          if y >= 0.0 then pi/2.0 else -pi/2.0
        !            55:       }
        !            56: end
        !            57: 
        !            58: procedure asin(x)
        !            59:    if abs(numeric(x)) <= 1.0 then
        !            60:       return atan2(x, (1.0-(x^2))^0.5)
        !            61: end
        !            62: 
        !            63: procedure acos(x)
        !            64:    return 1.570796326794896619231e0 - asin(x)
        !            65: end
        !            66: 
        !            67: procedure dtor(deg)
        !            68:    return numeric(deg)/57.29577951308232
        !            69: end
        !            70: 
        !            71: procedure rtod(rad)
        !            72:    return numeric(rad)*57.29577951308232
        !            73: end
        !            74: 
        !            75: procedure sqrt(x)
        !            76:     return (0.0 <= numeric(x)) ^ 0.5
        !            77: end
        !            78: 
        !            79: procedure floor(x)
        !            80:    return if numeric(x) then
        !            81:       if x>=0.0 | real(x)=integer(x) then integer(x) else -integer(-x+1)
        !            82: end
        !            83: 
        !            84: procedure ceil(x)
        !            85:    return -floor(-numeric(x))
        !            86: end
        !            87: 
        !            88: procedure log(x)
        !            89:    local z, zsq, ex
        !            90:    static log2, sqrto2, p0, p1, p2, p3, q0, q1, q2
        !            91:    initial {
        !            92:       # The coefficients are #2705 from Hart & Cheney. (19.38D)
        !            93:       log2   :=  0.693147180559945309e0
        !            94:       sqrto2 :=  0.707106781186547524e0
        !            95:       p0     := -0.240139179559210510e2
        !            96:       p1     :=  0.309572928215376501e2
        !            97:       p2     := -0.963769093368686593e1
        !            98:       p3     :=  0.421087371217979714e0
        !            99:       q0     := -0.120069589779605255e2
        !           100:       q1     :=  0.194809660700889731e2
        !           101:       q2     := -0.891110902798312337e1
        !           102:       }
        !           103:    if numeric(x) > 0.0 then {
        !           104:       ex := 0
        !           105:       while x >= 1.0 do {
        !           106:          x /:= 2.0
        !           107:          ex +:= 1
        !           108:          }
        !           109:       while x < 0.5 do {
        !           110:          x *:= 2.0
        !           111:          ex -:= 1
        !           112:          }
        !           113:       if x < sqrto2 then {
        !           114:          x *:= 2.0
        !           115:          ex -:= 1
        !           116:          }
        !           117:       return ((((p3*(zsq:=(z:=(x-1.0)/(x+1.0))^2)+p2)*zsq+p1)*zsq+p0)/
        !           118:              (((1.0*zsq+q2)*zsq+q1)*zsq+q0))*z+ex*log2
        !           119:       }
        !           120: end
        !           121: 
        !           122: procedure exp(x)
        !           123:    return 2.718281828459045235360287 ^ numeric(x)
        !           124: end
        !           125: 
        !           126: procedure log10(x)
        !           127:    return log(x)/2.30258509299404568402
        !           128: end
        !           129: 
        !           130: procedure _sinus(x,quad)
        !           131:    local ysq, y, k
        !           132:    static twoopi, p0, p1, p2, p3, p4, q0, q1, q2, q3
        !           133:    initial {
        !           134:       # Coefficients are #3370 from Hart & Cheney (18.80D).
        !           135:       twoopi :=  0.63661977236758134308
        !           136:       p0     :=  0.1357884097877375669092680e8
        !           137:       p1     := -0.4942908100902844161158627e7
        !           138:       p2     :=  0.4401030535375266501944918e6
        !           139:       p3     := -0.1384727249982452873054457e5
        !           140:       p4     :=  0.1459688406665768722226959e3
        !           141:       q0     :=  0.8644558652922534429915149e7
        !           142:       q1     :=  0.4081792252343299749395779e6
        !           143:       q2     :=  0.9463096101538208180571257e4
        !           144:       q3     :=  0.1326534908786136358911494e3
        !           145:       }
        !           146:    if x < 0.0 then {
        !           147:       x := -x
        !           148:       quad +:= 2
        !           149:       }
        !           150:    y := (x *:= twoopi) - (k := integer(x))
        !           151:    if (quad := (quad + k) % 4) = (1|3) then
        !           152:       y := 1.0 - y
        !           153:    if quad > 1 then
        !           154:       y := -y
        !           155:    return (((((p4*(ysq:=y^2)+p3)*ysq+p2)*ysq+p1)*ysq+p0)*y) /
        !           156:            ((((ysq+q3)*ysq+q2)*ysq+q1)*ysq+q0)
        !           157: end
        !           158: 
        !           159: procedure _satan(x)
        !           160:    static sq2p1,sq2m1,pio2,pio4
        !           161:    initial {
        !           162:       sq2p1 := 2.414213562373095048802e0
        !           163:       sq2m1 := 0.414213562373095048802e0
        !           164:       pio2  := 1.570796326794896619231e0
        !           165:       pio4  := 0.785398163397448309615e0
        !           166:       }
        !           167:    return if x < sq2m1 then
        !           168:              _xatan(x)
        !           169:           else if x > sq2p1 then
        !           170:              pio2 - _xatan(1.0/x)
        !           171:           else
        !           172:              pio4 + _xatan((x-1.0)/(x+1.0))
        !           173: end
        !           174: 
        !           175: procedure _xatan(x)
        !           176:    local xsq
        !           177:    static p4,p3,p2,p1,p0,q4,q3,q2,q1,q0
        !           178:    initial {
        !           179:       # coefficients are #5077 from Hart & Cheney. (19.56D)
        !           180:       p4    := 0.161536412982230228262e2
        !           181:       p3    := 0.26842548195503973794141e3
        !           182:       p2    := 0.11530293515404850115428136e4
        !           183:       p1    := 0.178040631643319697105464587e4
        !           184:       p0    := 0.89678597403663861959987488e3
        !           185:       q4    := 0.5895697050844462222791e2
        !           186:       q3    := 0.536265374031215315104235e3
        !           187:       q2    := 0.16667838148816337184521798e4
        !           188:       q1    := 0.207933497444540981287275926e4
        !           189:       q0    := 0.89678597403663861962481162e3
        !           190:       }
        !           191:    return x * ((((p4*(xsq:=x^2)+p3)*xsq+p2)*xsq+p1)*xsq+p0) /
        !           192:           (((((xsq+q4)*xsq+q3)*xsq+q2)*xsq+q1)*xsq+q0)
        !           193: end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.