1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
28:
29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
39:
40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
50:
51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
80:
81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177:
178:
179: #ifndef GDTOAIMP_H_INCLUDED
180: #define GDTOAIMP_H_INCLUDED
181: #include "gdtoa.h"
182: #include "gd_qnan.h"
183: #ifdef Honor_FLT_ROUNDS
184: #include <fenv.h>
185: #endif
186:
187: #ifdef DEBUG
188: #include "stdio.h"
189: #include "stdlib.h"
190: #define Bug(x) {fprintf(stderr, "%s\n", x); abort();}
191: #endif
192:
193: #include "stdlib.h"
194: #include "string.h"
195:
196: #ifdef KR_headers
197: #define Char char
198: #else
199: #define Char void
200: #endif
201:
202: #ifdef MALLOC
203: extern Char *MALLOC ANSI((size_t));
204: #else
205: #define MALLOC malloc
206: #endif
207:
208: #undef IEEE_Arith
209: #undef Avoid_Underflow
210: #ifdef IEEE_MC68k
211: #define IEEE_Arith
212: #endif
213: #ifdef IEEE_8087
214: #define IEEE_Arith
215: #endif
216:
217: #include "errno.h"
218: #ifdef Bad_float_h
219:
220: #ifdef IEEE_Arith
221: #define DBL_DIG 15
222: #define DBL_MAX_10_EXP 308
223: #define DBL_MAX_EXP 1024
224: #define FLT_RADIX 2
225: #define DBL_MAX 1.7976931348623157e+308
226: #endif
227:
228: #ifdef IBM
229: #define DBL_DIG 16
230: #define DBL_MAX_10_EXP 75
231: #define DBL_MAX_EXP 63
232: #define FLT_RADIX 16
233: #define DBL_MAX 7.2370055773322621e+75
234: #endif
235:
236: #ifdef VAX
237: #define DBL_DIG 16
238: #define DBL_MAX_10_EXP 38
239: #define DBL_MAX_EXP 127
240: #define FLT_RADIX 2
241: #define DBL_MAX 1.7014118346046923e+38
242: #define n_bigtens 2
243: #endif
244:
245: #ifndef LONG_MAX
246: #define LONG_MAX 2147483647
247: #endif
248:
249: #else
250: #include "float.h"
251: #endif
252:
253: #ifdef IEEE_Arith
254: #define Scale_Bit 0x10
255: #define n_bigtens 5
256: #endif
257:
258: #ifdef IBM
259: #define n_bigtens 3
260: #endif
261:
262: #ifdef VAX
263: #define n_bigtens 2
264: #endif
265:
266: #ifndef __MATH_H__
267: #include "math.h"
268: #endif
269:
270: #ifdef __cplusplus
271: extern "C" {
272: #endif
273:
274: #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
275: Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
276: #endif
277:
278: typedef union { double d; ULong L[2]; } U;
279:
280: #if defined(IEEE_8087) && _BYTE_ORDER != _BIG_ENDIAN
281: #define word0(x) (x)->L[1]
282: #define word1(x) (x)->L[0]
283: #else
284: #define word0(x) (x)->L[0]
285: #define word1(x) (x)->L[1]
286: #endif
287: #define dval(x) (x)->d
288:
289: 290: 291: 292:
293: #if ( defined(IEEE_8087) + defined(VAX) ) && _BYTE_ORDER != _BIG_ENDIAN
294: #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
295: ((unsigned short *)a)[0] = (unsigned short)c, a++)
296: #else
297: #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
298: ((unsigned short *)a)[1] = (unsigned short)c, a++)
299: #endif
300:
301:
302:
303:
304:
305:
306:
307: #ifdef IEEE_Arith
308: #define Exp_shift 20
309: #define Exp_shift1 20
310: #define Exp_msk1 0x100000
311: #define Exp_msk11 0x100000
312: #define Exp_mask 0x7ff00000
313: #define P 53
314: #define Bias 1023
315: #define Emin (-1022)
316: #define Exp_1 0x3ff00000
317: #define Exp_11 0x3ff00000
318: #define Ebits 11
319: #define Frac_mask 0xfffff
320: #define Frac_mask1 0xfffff
321: #define Ten_pmax 22
322: #define Bletch 0x10
323: #define Bndry_mask 0xfffff
324: #define Bndry_mask1 0xfffff
325: #define LSB 1
326: #define Sign_bit 0x80000000
327: #define Log2P 1
328: #define Tiny0 0
329: #define Tiny1 1
330: #define Quick_max 14
331: #define Int_max 14
332:
333: #ifndef Flt_Rounds
334: #ifdef FLT_ROUNDS
335: #define Flt_Rounds FLT_ROUNDS
336: #else
337: #define Flt_Rounds 1
338: #endif
339: #endif
340:
341: #else
342: #undef Sudden_Underflow
343: #define Sudden_Underflow
344: #ifdef IBM
345: #undef Flt_Rounds
346: #define Flt_Rounds 0
347: #define Exp_shift 24
348: #define Exp_shift1 24
349: #define Exp_msk1 0x1000000
350: #define Exp_msk11 0x1000000
351: #define Exp_mask 0x7f000000
352: #define P 14
353: #define Bias 65
354: #define Exp_1 0x41000000
355: #define Exp_11 0x41000000
356: #define Ebits 8
357: #define Frac_mask 0xffffff
358: #define Frac_mask1 0xffffff
359: #define Bletch 4
360: #define Ten_pmax 22
361: #define Bndry_mask 0xefffff
362: #define Bndry_mask1 0xffffff
363: #define LSB 1
364: #define Sign_bit 0x80000000
365: #define Log2P 4
366: #define Tiny0 0x100000
367: #define Tiny1 0
368: #define Quick_max 14
369: #define Int_max 15
370: #else
371: #undef Flt_Rounds
372: #define Flt_Rounds 1
373: #define Exp_shift 23
374: #define Exp_shift1 7
375: #define Exp_msk1 0x80
376: #define Exp_msk11 0x800000
377: #define Exp_mask 0x7f80
378: #define P 56
379: #define Bias 129
380: #define Emin (-127)
381: #define Exp_1 0x40800000
382: #define Exp_11 0x4080
383: #define Ebits 8
384: #define Frac_mask 0x7fffff
385: #define Frac_mask1 0xffff007f
386: #define Ten_pmax 24
387: #define Bletch 2
388: #define Bndry_mask 0xffff007f
389: #define Bndry_mask1 0xffff007f
390: #define LSB 0x10000
391: #define Sign_bit 0x8000
392: #define Log2P 1
393: #define Tiny0 0x80
394: #define Tiny1 0
395: #define Quick_max 15
396: #define Int_max 15
397: #endif
398: #endif
399:
400: #ifndef IEEE_Arith
401: #define ROUND_BIASED
402: #else
403: #ifdef ROUND_BIASED_without_Round_Up
404: #undef ROUND_BIASED
405: #define ROUND_BIASED
406: #endif
407: #endif
408:
409: #ifdef RND_PRODQUOT
410: #define rounded_product(a,b) a = rnd_prod(a, b)
411: #define rounded_quotient(a,b) a = rnd_quot(a, b)
412: #ifdef KR_headers
413: extern double rnd_prod(), rnd_quot();
414: #else
415: extern double rnd_prod(double, double), rnd_quot(double, double);
416: #endif
417: #else
418: #define rounded_product(a,b) a *= b
419: #define rounded_quotient(a,b) a /= b
420: #endif
421:
422: #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
423: #define Big1 0xffffffff
424:
425: #undef Pack_16
426: #ifndef Pack_32
427: #define Pack_32
428: #endif
429:
430: #ifdef NO_LONG_LONG
431: #undef ULLong
432: #ifdef Just_16
433: #undef Pack_32
434: #define Pack_16
435: 436: 437: 438: 439:
440: #endif
441: #else
442: #ifndef Llong
443: #define Llong long long
444: #endif
445: #ifndef ULLong
446: #define ULLong unsigned Llong
447: #endif
448: #endif
449:
450: #ifdef Pack_32
451: #define ULbits 32
452: #define kshift 5
453: #define kmask 31
454: #define ALL_ON 0xffffffff
455: #else
456: #define ULbits 16
457: #define kshift 4
458: #define kmask 15
459: #define ALL_ON 0xffff
460: #endif
461:
462: #ifndef MULTIPLE_THREADS
463: #define ACQUIRE_DTOA_LOCK(n)
464: #define FREE_DTOA_LOCK(n)
465: #else
466: #include "thread_private.h"
467: extern void *__dtoa_locks[];
468: #define ACQUIRE_DTOA_LOCK(n) _MUTEX_LOCK(&__dtoa_locks[n])
469: #define FREE_DTOA_LOCK(n) _MUTEX_UNLOCK(&__dtoa_locks[n])
470: #endif
471:
472: #define Kmax 9
473:
474: struct
475: Bigint {
476: struct Bigint *next;
477: int k, maxwds, sign, wds;
478: ULong x[1];
479: };
480:
481: typedef struct Bigint Bigint;
482:
483: #ifdef NO_STRING_H
484: #ifdef DECLARE_SIZE_T
485: typedef unsigned int size_t;
486: #endif
487: extern void memcpy_D2A ANSI((void*, const void*, size_t));
488: #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
489: #else
490: #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
491: #endif
492:
493: #define dtoa __dtoa
494: #define gdtoa __gdtoa
495: #define freedtoa __freedtoa
496: #define strtodg __strtodg
497: #define g_ddfmt __g_ddfmt
498: #define g_dfmt __g_dfmt
499: #define g_ffmt __g_ffmt
500: #define g_Qfmt __g_Qfmt
501: #define g_xfmt __g_xfmt
502: #define g_xLfmt __g_xLfmt
503: #define strtoId __strtoId
504: #define strtoIdd __strtoIdd
505: #define strtoIf __strtoIf
506: #define strtoIQ __strtoIQ
507: #define strtoIx __strtoIx
508: #define strtoIxL __strtoIxL
509: #define strtord __strtord
510: #define strtordd __strtordd
511: #define strtorf __strtorf
512: #define strtorQ __strtorQ
513: #define strtorx __strtorx
514: #define strtorxL __strtorxL
515: #define strtodI __strtodI
516: #define strtopd __strtopd
517: #define strtopdd __strtopdd
518: #define strtopf __strtopf
519: #define strtopQ __strtopQ
520: #define strtopx __strtopx
521: #define strtopxL __strtopxL
522:
523: #define Balloc __Balloc_D2A
524: #define Bfree __Bfree_D2A
525: #define ULtoQ __ULtoQ_D2A
526: #define ULtof __ULtof_D2A
527: #define ULtod __ULtod_D2A
528: #define ULtodd __ULtodd_D2A
529: #define ULtox __ULtox_D2A
530: #define ULtoxL __ULtoxL_D2A
531: #define any_on __any_on_D2A
532: #define b2d __b2d_D2A
533: #define bigtens __bigtens_D2A
534: #define cmp __cmp_D2A
535: #define copybits __copybits_D2A
536: #define d2b __d2b_D2A
537: #define decrement __decrement_D2A
538: #define diff __diff_D2A
539: #define dtoa_result __dtoa_result_D2A
540: #define g__fmt __g__fmt_D2A
541: #define gethex __gethex_D2A
542: #define hexdig __hexdig_D2A
543: #define hexnan __hexnan_D2A
544: #define hi0bits(x) __hi0bits_D2A((ULong)(x))
545: #define hi0bits_D2A __hi0bits_D2A
546: #define i2b __i2b_D2A
547: #define increment __increment_D2A
548: #define lo0bits __lo0bits_D2A
549: #define lshift __lshift_D2A
550: #define match __match_D2A
551: #define mult __mult_D2A
552: #define multadd __multadd_D2A
553: #define nrv_alloc __nrv_alloc_D2A
554: #define pow5mult __pow5mult_D2A
555: #define quorem __quorem_D2A
556: #define ratio __ratio_D2A
557: #define rshift __rshift_D2A
558: #define rv_alloc __rv_alloc_D2A
559: #define s2b __s2b_D2A
560: #define set_ones __set_ones_D2A
561: #define strcp __strcp_D2A
562: #define strtoIg __strtoIg_D2A
563: #define sulp __sulp_D2A
564: #define sum __sum_D2A
565: #define tens __tens_D2A
566: #define tinytens __tinytens_D2A
567: #define tinytens __tinytens_D2A
568: #define trailz __trailz_D2A
569: #define ulp __ulp_D2A
570:
571: extern char *dtoa_result;
572: extern CONST double bigtens[], tens[], tinytens[];
573: extern unsigned char hexdig[];
574:
575: extern Bigint *Balloc ANSI((int));
576: extern void Bfree ANSI((Bigint*));
577: extern void ULtof ANSI((ULong*, ULong*, Long, int));
578: extern void ULtod ANSI((ULong*, ULong*, Long, int));
579: extern void ULtodd ANSI((ULong*, ULong*, Long, int));
580: extern void ULtoQ ANSI((ULong*, ULong*, Long, int));
581: extern void ULtox ANSI((UShort*, ULong*, Long, int));
582: extern void ULtoxL ANSI((ULong*, ULong*, Long, int));
583: extern ULong any_on ANSI((Bigint*, int));
584: extern double b2d ANSI((Bigint*, int*));
585: extern int cmp ANSI((Bigint*, Bigint*));
586: extern void copybits ANSI((ULong*, int, Bigint*));
587: extern Bigint *d2b ANSI((double, int*, int*));
588: extern void decrement ANSI((Bigint*));
589: extern Bigint *diff ANSI((Bigint*, Bigint*));
590: extern char *dtoa ANSI((double d, int mode, int ndigits,
591: int *decpt, int *sign, char **rve));
592: extern char *g__fmt ANSI((char*, char*, char*, int, ULong, size_t));
593: extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int));
594: extern void hexdig_init_D2A(Void);
595: extern int hexnan ANSI((CONST char**, FPI*, ULong*));
596: extern int hi0bits_D2A ANSI((ULong));
597: extern Bigint *i2b ANSI((int));
598: extern Bigint *increment ANSI((Bigint*));
599: extern int lo0bits ANSI((ULong*));
600: extern Bigint *lshift ANSI((Bigint*, int));
601: extern int match ANSI((CONST char**, char*));
602: extern Bigint *mult ANSI((Bigint*, Bigint*));
603: extern Bigint *multadd ANSI((Bigint*, int, int));
604: extern char *nrv_alloc ANSI((char*, char **, int));
605: extern Bigint *pow5mult ANSI((Bigint*, int));
606: extern int quorem ANSI((Bigint*, Bigint*));
607: extern double ratio ANSI((Bigint*, Bigint*));
608: extern void rshift ANSI((Bigint*, int));
609: extern char *rv_alloc ANSI((int));
610: extern Bigint *s2b ANSI((CONST char*, int, int, ULong, int));
611: extern Bigint *set_ones ANSI((Bigint*, int));
612: extern char *strcp ANSI((char*, const char*));
613: extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*));
614: extern double strtod ANSI((const char *s00, char **se));
615: extern Bigint *sum ANSI((Bigint*, Bigint*));
616: extern int trailz ANSI((Bigint*));
617: extern double ulp ANSI((U*));
618:
619: #ifdef __cplusplus
620: }
621: #endif
622: 623: 624: 625: 626: 627: 628: 629: 630:
631: #ifdef IEEE_Arith
632: #ifndef NO_INFNAN_CHECK
633: #undef INFNAN_CHECK
634: #define INFNAN_CHECK
635: #endif
636: #ifdef IEEE_MC68k
637: #define _0 0
638: #define _1 1
639: #ifndef NAN_WORD0
640: #define NAN_WORD0 d_QNAN0
641: #endif
642: #ifndef NAN_WORD1
643: #define NAN_WORD1 d_QNAN1
644: #endif
645: #else
646: #define _0 1
647: #define _1 0
648: #ifndef NAN_WORD0
649: #define NAN_WORD0 d_QNAN1
650: #endif
651: #ifndef NAN_WORD1
652: #define NAN_WORD1 d_QNAN0
653: #endif
654: #endif
655: #else
656: #undef INFNAN_CHECK
657: #endif
658:
659: #undef SI
660: #ifdef Sudden_Underflow
661: #define SI 1
662: #else
663: #define SI 0
664: #endif
665:
666: #ifdef _T2EX
667: 668:
669: #define Omit_Private_Memory
670: #endif
671:
672: #endif