X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Finternal%2Ffloatscan.c;h=278bf25025d64e1b6375e1b2a57ab5e2b3306246;hb=dc2f368e565c37728b0d620380b849c3a1ddd78f;hp=aa962f41efb5676f56b9910dee38422c1e469869;hpb=77731d0ec16027cb0e3a593d5dd9bb906932303e;p=musl diff --git a/src/internal/floatscan.c b/src/internal/floatscan.c index aa962f41..278bf250 100644 --- a/src/internal/floatscan.c +++ b/src/internal/floatscan.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "shgetc.h" #include "floatscan.h" @@ -14,12 +15,20 @@ #define LD_B1B_MAX 9007199, 254740991 #define KMAX 128 -#else /* LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 */ +#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 #define LD_B1B_DIG 3 #define LD_B1B_MAX 18, 446744073, 709551615 #define KMAX 2048 +#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 + +#define LD_B1B_DIG 4 +#define LD_B1B_MAX 10384593, 717069655, 257060992, 658440191 +#define KMAX 2048 + +#else +#error Unsupported long double representation #endif #define MASK (KMAX-1) @@ -89,7 +98,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po if (gotrad) break; gotrad = 1; lrp = dc; - } else if (k < KMAX-2) { + } else if (k < KMAX-3) { dc++; if (c!='0') lnz = dc; if (j) x[k] = x[k]*10 + c-'0'; @@ -101,7 +110,10 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po gotdig=1; } else { dc++; - if (c!='0') x[KMAX-3] |= 1; + if (c!='0') { + lnz = (KMAX-4)*9; + x[KMAX-4] |= 1; + } } } if (!gotrad) lrp=dc; @@ -143,7 +155,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po } /* Align incomplete final B1B digit */ - if (k=0 ? rp%9 : rp%9+9; @@ -199,11 +214,11 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po } if (carry) { rp += 9; + a = (a-1 & MASK); if (a == z) { z = (z-1 & MASK); x[z-1 & MASK] |= x[z]; } - a = (a-1 & MASK); x[a] = carry; } } @@ -244,7 +259,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po /* Assemble desired bits into floating point variable */ for (y=i=0; i