⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 floatconv.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
                        word0(a) = 0x80000 >> L;                        word1(a) = 0;                        }                else {                        word0(a) = 0;                        L -= Exp_shift;                        word1(a) = L >= 31 ? 1 : 1 << 31 - L;                        }                }#endif        return a;        } static doubleb2d#ifdef KR_headers        (a, e) Bigint *a; int *e;#else        (Bigint *a, int *e)#endif{        unsigned long *xa, *xa0, w, y, z;        int k;        double d;#ifdef VAX        unsigned long d0, d1;#else#define d0 word0(d)#define d1 word1(d)#endif        xa0 = a->x;        xa = xa0 + a->wds;        y = *--xa;#ifdef DEBUG        if (!y) Bug("zero y in b2d");#endif        k = hi0bits(y);        *e = 32 - k;#ifdef Pack_32        if (k < Ebits) {                d0 = Exp_1 | y >> Ebits - k;                w = xa > xa0 ? *--xa : 0;                d1 = y << (32-Ebits) + k | w >> Ebits - k;                goto ret_d;                }        z = xa > xa0 ? *--xa : 0;        if (k -= Ebits) {                d0 = Exp_1 | y << k | z >> 32 - k;                y = xa > xa0 ? *--xa : 0;                d1 = z << k | y >> 32 - k;                }        else {                d0 = Exp_1 | y;                d1 = z;                }#else        if (k < Ebits + 16) {                z = xa > xa0 ? *--xa : 0;                d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;                w = xa > xa0 ? *--xa : 0;                y = xa > xa0 ? *--xa : 0;                d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;                goto ret_d;                }        z = xa > xa0 ? *--xa : 0;        w = xa > xa0 ? *--xa : 0;        k -= Ebits + 16;        d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;        y = xa > xa0 ? *--xa : 0;        d1 = w << k + 16 | y << k;#endif ret_d:#ifdef VAX        word0(d) = d0 >> 16 | d0 << 16;        word1(d) = d1 >> 16 | d1 << 16;#else#undef d0#undef d1#endif        return d;        } static Bigint *d2b#ifdef KR_headers        (d, e, bits) double d; int *e, *bits;#else        (double d, int *e, int *bits)#endif{        Bigint *b;        int de, i, k;        unsigned long *x, y, z;#ifdef VAX        unsigned long d0, d1;        d0 = word0(d) >> 16 | word0(d) << 16;        d1 = word1(d) >> 16 | word1(d) << 16;#else#define d0 word0(d)#define d1 word1(d)#endif#ifdef Pack_32        b = Balloc(1);#else        b = Balloc(2);#endif        x = b->x;        z = d0 & Frac_mask;        d0 &= 0x7fffffff;       /* clear sign bit, which we ignore */#ifdef Sudden_Underflow        de = (int)(d0 >> Exp_shift);#ifndef IBM        z |= Exp_msk11;#endif#else        if (de = (int)(d0 >> Exp_shift))                z |= Exp_msk1;#endif#ifdef Pack_32        if (y = d1) {                if (k = lo0bits(&y)) {                        x[0] = y | z << 32 - k;                        z >>= k;                        }                else                        x[0] = y;                i = b->wds = (x[1] = z) ? 2 : 1;                }        else {#ifdef DEBUG                if (!z)                        Bug("Zero passed to d2b");#endif                k = lo0bits(&z);                x[0] = z;                i = b->wds = 1;                k += 32;                }#else        if (y = d1) {                if (k = lo0bits(&y))                        if (k >= 16) {                                x[0] = y | z << 32 - k & 0xffff;                                x[1] = z >> k - 16 & 0xffff;                                x[2] = z >> k;                                i = 2;                                }                        else {                                x[0] = y & 0xffff;                                x[1] = y >> 16 | z << 16 - k & 0xffff;                                x[2] = z >> k & 0xffff;                                x[3] = z >> k+16;                                i = 3;                                }                else {                        x[0] = y & 0xffff;                        x[1] = y >> 16;                        x[2] = z & 0xffff;                        x[3] = z >> 16;                        i = 3;                        }                }        else {#ifdef DEBUG                if (!z)                        Bug("Zero passed to d2b");#endif                k = lo0bits(&z);                if (k >= 16) {                        x[0] = z;                        i = 0;                        }                else {                        x[0] = z & 0xffff;                        x[1] = z >> 16;                        i = 1;                        }                k += 32;                }        while(!x[i])                --i;        b->wds = i + 1;#endif#ifndef Sudden_Underflow        if (de) {#endif#ifdef IBM                *e = (de - Bias - (P-1) << 2) + k;                *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);#else                *e = de - Bias - (P-1) + k;                *bits = P - k;#endif#ifndef Sudden_Underflow                }        else {                *e = de - Bias - (P-1) + 1 + k;#ifdef Pack_32                *bits = 32*i - hi0bits(x[i-1]);#else                *bits = (i+2)*16 - hi0bits(x[i]);#endif                }#endif        return b;        }#undef d0#undef d1 static doubleratio#ifdef KR_headers        (a, b) Bigint *a, *b;#else        (Bigint *a, Bigint *b)#endif{        double da, db;        int k, ka, kb;        da = b2d(a, &ka);        db = b2d(b, &kb);#ifdef Pack_32        k = ka - kb + 32*(a->wds - b->wds);#else        k = ka - kb + 16*(a->wds - b->wds);#endif#ifdef IBM        if (k > 0) {                word0(da) += (k >> 2)*Exp_msk1;                if (k &= 3)                        da *= 1 << k;                }        else {                k = -k;                word0(db) += (k >> 2)*Exp_msk1;                if (k &= 3)                        db *= 1 << k;                }#else        if (k > 0)                word0(da) += k*Exp_msk1;        else {                k = -k;                word0(db) += k*Exp_msk1;                }#endif        return da / db;        } static doubletens[] = {                1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,                1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,                1e20, 1e21, 1e22#ifdef VAX                , 1e23, 1e24#endif                }; static double#ifdef IEEE_Arithbigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };static double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };#define n_bigtens 5#else#ifdef IBMbigtens[] = { 1e16, 1e32, 1e64 };static double tinytens[] = { 1e-16, 1e-32, 1e-64 };#define n_bigtens 3#elsebigtens[] = { 1e16, 1e32 };static double tinytens[] = { 1e-16, 1e-32 };#define n_bigtens 2#endif#endif double_Xstrtod#ifdef KR_headers        (s00, se) CONST char *s00; char **se;#else        (CONST char *s00, char **se)#endif{        int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,                 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;        CONST char *s, *s0, *s1;        double aadj, aadj1, adj, rv, rv0;        long L;        unsigned long y, z;        Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;	TEST_ENDIANNESS;        sign = nz0 = nz = 0;        rv = 0.;        for(s = s00;;s++) switch(*s) {                case '-':                        sign = 1;                        /* no break */                case '+':                        if (*++s)                                goto break2;                        /* no break */                case 0:                        goto ret;                case '\t':                case '\n':                case '\v':                case '\f':                case '\r':                case ' ':                        continue;                default:                        goto break2;                } break2:        if (*s == '0') {                nz0 = 1;                while(*++s == '0') ;                if (!*s)                        goto ret;                }        s0 = s;        y = z = 0;        for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)                if (nd < 9)                        y = 10*y + c - '0';                else if (nd < 16)                        z = 10*z + c - '0';        nd0 = nd;        if (c == '.') {                c = *++s;                if (!nd) {                        for(; c == '0'; c = *++s)                                nz++;                        if (c > '0' && c <= '9') {                                s0 = s;                                nf += nz;                                nz = 0;                                goto have_dig;                                }                        goto dig_done;                        }                for(; c >= '0' && c <= '9'; c = *++s) { have_dig:                        nz++;                        if (c -= '0') {                                nf += nz;                                for(i = 1; i < nz; i++)                                        if (nd++ < 9)                                                y *= 10;                                        else if (nd <= DBL_DIG + 1)                                                z *= 10;                                if (nd++ < 9)                                        y = 10*y + c;                                else if (nd <= DBL_DIG + 1)                                        z = 10*z + c;                                nz = 0;                                }                        }                } dig_done:        e = 0;        if (c == 'e' || c == 'E') {                if (!nd && !nz && !nz0) {                        s = s00;                        goto ret;                        }                s00 = s;                esign = 0;                switch(c = *++s) {                        case '-':                                esign = 1;                        case '+':                                c = *++s;                        }                if (c >= '0' && c <= '9') {                        while(c == '0')                                c = *++s;                        if (c > '0' && c <= '9') {                                e = c - '0';                                s1 = s;                                while((c = *++s) >= '0' && c <= '9')                                        e = 10*e + c - '0';                                if (s - s1 > 8)                                        /* Avoid confusion from exponents                                         * so large that e might overflow.                                         */                                        e = 9999999;                                if (esign)                                        e = -e;                                }                        else                                e = 0;                        }                else                        s = s00;                }        if (!nd) {                if (!nz && !nz0)                        s = s00;                goto ret;                }        e1 = e -= nf;        /* Now we have nd0 digits, starting at s0, followed by a         * decimal point, followed by nd-nd0 digits.  The number we're         * after is the integer represented by those digits times         * 10**e */        if (!nd0)                nd0 = nd;        k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;        rv = y;        if (k > 9)                rv = tens[k - 9] * rv + z;        if (nd <= DBL_DIG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -