1/**************************************************************** 2 3The author of this software is David M. Gay. 4 5Copyright (C) 1998, 1999 by Lucent Technologies 6All Rights Reserved 7 8Permission to use, copy, modify, and distribute this software and --- 78 unchanged lines hidden (view full) --- 87#ifdef KR_headers 88 (v) Bigint *v; 89#else 90 (Bigint *v) 91#endif 92{ 93 if (v) { 94 if (v->k > Kmax) |
95#ifdef FREE 96 FREE((void*)v); 97#else |
98 free((void*)v); |
99#endif |
100 else { 101 ACQUIRE_DTOA_LOCK(0); 102 v->next = freelist[v->k]; 103 freelist[v->k] = v; 104 FREE_DTOA_LOCK(0); 105 } 106 } 107 } 108 109 int 110lo0bits 111#ifdef KR_headers 112 (y) ULong *y; 113#else 114 (ULong *y) 115#endif 116{ |
117 int k; 118 ULong x = *y; |
119 120 if (x & 7) { 121 if (x & 1) 122 return 0; 123 if (x & 2) { 124 *y = x >> 1; 125 return 1; 126 } --- 82 unchanged lines hidden (view full) --- 209 b->wds = wds; 210 } 211 return b; 212 } 213 214 int 215hi0bits_D2A 216#ifdef KR_headers |
217 (x) ULong x; |
218#else |
219 (ULong x) |
220#endif 221{ |
222 int k = 0; |
223 224 if (!(x & 0xffff0000)) { 225 k = 16; 226 x <<= 16; 227 } 228 if (!(x & 0xff000000)) { 229 k += 8; 230 x <<= 8; --- 386 unchanged lines hidden (view full) --- 617#ifdef KR_headers 618 (a, e) Bigint *a; int *e; 619#else 620 (Bigint *a, int *e) 621#endif 622{ 623 ULong *xa, *xa0, w, y, z; 624 int k; |
625 U d; |
626#ifdef VAX 627 ULong d0, d1; 628#else |
629#define d0 word0(&d) 630#define d1 word1(&d) |
631#endif 632 633 xa0 = a->x; 634 xa = xa0 + a->wds; 635 y = *--xa; 636#ifdef DEBUG 637 if (!y) Bug("zero y in b2d"); 638#endif 639 k = hi0bits(y); 640 *e = 32 - k; 641#ifdef Pack_32 642 if (k < Ebits) { |
643 d0 = Exp_1 | y >> (Ebits - k); |
644 w = xa > xa0 ? *--xa : 0; |
645 d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); |
646 goto ret_d; 647 } 648 z = xa > xa0 ? *--xa : 0; 649 if (k -= Ebits) { |
650 d0 = Exp_1 | y << k | z >> (32 - k); |
651 y = xa > xa0 ? *--xa : 0; |
652 d1 = z << k | y >> (32 - k); |
653 } 654 else { 655 d0 = Exp_1 | y; 656 d1 = z; 657 } 658#else 659 if (k < Ebits + 16) { 660 z = xa > xa0 ? *--xa : 0; --- 7 unchanged lines hidden (view full) --- 668 w = xa > xa0 ? *--xa : 0; 669 k -= Ebits + 16; 670 d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; 671 y = xa > xa0 ? *--xa : 0; 672 d1 = w << k + 16 | y << k; 673#endif 674 ret_d: 675#ifdef VAX |
676 word0(&d) = d0 >> 16 | d0 << 16; 677 word1(&d) = d1 >> 16 | d1 << 16; |
678#endif |
679 return dval(&d); |
680 } 681#undef d0 682#undef d1 683 684 Bigint * 685d2b 686#ifdef KR_headers |
687 (dd, e, bits) double dd; int *e, *bits; |
688#else |
689 (double dd, int *e, int *bits) |
690#endif 691{ 692 Bigint *b; |
693 U d; |
694#ifndef Sudden_Underflow 695 int i; 696#endif 697 int de, k; 698 ULong *x, y, z; 699#ifdef VAX 700 ULong d0, d1; |
701#else |
702#define d0 word0(&d) 703#define d1 word1(&d) |
704#endif |
705 d.d = dd; 706#ifdef VAX 707 d0 = word0(&d) >> 16 | word0(&d) << 16; 708 d1 = word1(&d) >> 16 | word1(&d) << 16; 709#endif |
710 711#ifdef Pack_32 712 b = Balloc(1); 713#else 714 b = Balloc(2); 715#endif 716 x = b->x; 717 --- 6 unchanged lines hidden (view full) --- 724#endif 725#else 726 if ( (de = (int)(d0 >> Exp_shift)) !=0) 727 z |= Exp_msk1; 728#endif 729#ifdef Pack_32 730 if ( (y = d1) !=0) { 731 if ( (k = lo0bits(&y)) !=0) { |
732 x[0] = y | z << (32 - k); |
733 z >>= k; 734 } 735 else 736 x[0] = y; 737#ifndef Sudden_Underflow 738 i = 739#endif 740 b->wds = (x[1] = z) !=0 ? 2 : 1; 741 } 742 else { |
743 k = lo0bits(&z); 744 x[0] = z; 745#ifndef Sudden_Underflow 746 i = 747#endif 748 b->wds = 1; 749 k += 32; 750 } --- 42 unchanged lines hidden (view full) --- 793 --i; 794 b->wds = i + 1; 795#endif 796#ifndef Sudden_Underflow 797 if (de) { 798#endif 799#ifdef IBM 800 *e = (de - Bias - (P-1) << 2) + k; |
801 *bits = 4*P + 8 - k - hi0bits(word0(&d) & Frac_mask); |
802#else 803 *e = de - Bias - (P-1) + k; 804 *bits = P - k; 805#endif 806#ifndef Sudden_Underflow 807 } 808 else { 809 *e = de - Bias - (P-1) + 1 + k; --- 36 unchanged lines hidden (view full) --- 846 847 char * 848#ifdef KR_headers 849strcp_D2A(a, b) char *a; char *b; 850#else 851strcp_D2A(char *a, CONST char *b) 852#endif 853{ |
854 while((*a = *b++)) |
855 a++; 856 return a; 857 } 858 859#ifdef NO_STRING_H 860 861 Char * 862#ifdef KR_headers 863memcpy_D2A(a, b, len) Char *a; Char *b; size_t len; 864#else 865memcpy_D2A(void *a1, void *b1, size_t len) 866#endif 867{ |
868 char *a = (char*)a1, *ae = a + len; 869 char *b = (char*)b1, *a0 = a; |
870 while(a < ae) 871 *a++ = *b++; 872 return a0; 873 } 874 875#endif /* NO_STRING_H */ |