Annotation of 43BSDTahoe/cci/libM/sqrtd.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Square Root.
        !             3:  * New version by Les Powers (3/26/85).
        !             4:  * If the argument is less than zero, an error is reported.
        !             5:  * The single precision square root instruction "sqrtf" is
        !             6:  * used to generate the initial approximation.  Then two
        !             7:  * iterations of the Newton-Raphson method are used to improve
        !             8:  * the result to 56 bits.  Each iteration of the Newton-Raphson
        !             9:  * method uses the following replacement:
        !            10:  *     B = (B + A/B)/2
        !            11:  * where A is the argument and B is the approximation.
        !            12:  * In the following assembly code, the division by two is
        !            13:  * accomplished by subtracting one from the exponent field.
        !            14:  * To subtract one from the exponent field, the hex integer value
        !            15:  * 0x00800000 is subtracted from the first longword of the double
        !            16:  * precision number in registers r0 and r1.  The hex value 0x00800000
        !            17:  * is equal to decimal value 8838608.
        !            18:  */
        !            19: 
        !            20: #include <errno.h>
        !            21: 
        !            22: int    errno;
        !            23: 
        !            24: double
        !            25: sqrt(arg)
        !            26: double arg;
        !            27: {
        !            28:        if (arg > 0.0) {
        !            29:                asm("   ldf     4(fp)")
        !            30:                asm("   sqrtf")
        !            31:                asm("   clrl    r1")
        !            32:                asm("   stf     r0")
        !            33:                asm("   ldd     4(fp)")
        !            34:                asm("   divd    r0")
        !            35:                asm("   addd    r0")
        !            36:                asm("   std     r0")
        !            37:                asm("   subl2   $8388608,r0")
        !            38:                asm("   ldd     4(fp)")
        !            39:                asm("   divd    r0")
        !            40:                asm("   addd    r0")
        !            41:                asm("   std     r0")
        !            42:                asm("   subl2   $8388608,r0")
        !            43:        } else {
        !            44:                if (arg < 0.0)
        !            45:                        errno = EDOM;
        !            46:                return (0.0);
        !            47:        }
        !            48: }

unix.superglobalmegacorp.com

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