/* * Test fegetround() and fesetround(). */ static void test_fegsetround(void) { assert(fegetround() == FE_TONEAREST); assert(getround() == FE_TONEAREST); assert(FLT_ROUNDS == 1); assert(fesetround(FE_DOWNWARD) == 0); assert(fegetround() == FE_DOWNWARD); assert(getround() == FE_DOWNWARD); assert(FLT_ROUNDS == 3); assert(fesetround(FE_UPWARD) == 0); assert(getround() == FE_UPWARD); assert(fegetround() == FE_UPWARD); assert(FLT_ROUNDS == 2); assert(fesetround(FE_TOWARDZERO) == 0); assert(getround() == FE_TOWARDZERO); assert(fegetround() == FE_TOWARDZERO); assert(FLT_ROUNDS == 0); assert(fesetround(FE_TONEAREST) == 0); assert(getround() == FE_TONEAREST); assert(FLT_ROUNDS == 1); assert(feclearexcept(FE_ALL_EXCEPT) == 0); }
static int getrounding(TaskData *) { union db roundingRes; getround(&roundingRes); switch (roundingRes.wrd[1] & 3) { case 0: return POLY_ROUND_TONEAREST; /* Choose nearest */ case 1: return POLY_ROUND_TOZERO; /* Round towards zero */ case 2: return POLY_ROUND_UPWARD; /* Towards positive infinity */ case 3: return POLY_ROUND_DOWNWARD; /* Towards negative infinity */ } return 0; /* Never reached but this avoids warning message. */ }
int main(Void) { char *s, *se, *se1; double f1, fI[2]; int i, i1, ndig = 0, r = 1; long LL[2]; union { double f; ULong L[2]; } u; while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) { while(*s <= ' ') if (!*s++) continue; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || i >= '0' && i <= '9') { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': LL[0] = u.L[_0]; LL[1] = u.L[_1]; sscanf(s+1, "%lx %lx", &LL[0], &LL[1]); u.L[_0] = LL[0]; u.L[_1] = LL[1]; printf("\nInput: %s", ibuf); printf("--> f = #%lx %lx\n", (long)u.L[_0], (long)u.L[_1]); goto fmt_test; } printf("\nInput: %s", ibuf); i = strtord(ibuf, &se, r, &u.f); if (r == 1) { if ((u.f != strtod(ibuf, &se1) || se1 != se)) printf("***strtod and strtord disagree!!\n"); i1 = strtopd(ibuf, &se, &f1); if (i != i1 || u.f != f1 || se != se1) printf("***strtord and strtopd disagree!!\n"); } printf("strtod consumes %d bytes and returns %d with f = %.17g = #%lx %lx\n", (int)(se-ibuf), i, u.f, U u.L[_0], U u.L[_1]); fmt_test: se = g_dfmt(obuf, &u.f, ndig, sizeof(obuf)); printf("g_dfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : "<null>"); if (*s == '#') continue; printf("strtoId returns %d,", strtoId(ibuf, &se, fI, &fI[1])); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (fI[0] == fI[1]) { if (fI[0] == u.f) printf("fI[0] == fI[1] == strtod\n"); else printf("fI[0] == fI[1] = #%lx %lx = %.17g\n", U ((ULong*)fI)[_0], U ((ULong*)fI)[_1], fI[0]); } else { printf("fI[0] = #%lx %lx = %.17g\n", U ((ULong*)fI)[_0], U ((ULong*)fI)[_1], fI[0]); printf("fI[1] = #%lx %lx = %.17g\n", U ((ULong*)&fI[1])[_0], U ((ULong*)&fI[1])[_1], fI[1]); if (fI[0] == u.f) printf("fI[0] == strtod\n"); else if (fI[1] == u.f) printf("fI[1] == strtod\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); } return 0; }
int main(Void) { char *s, *s1, *se, *se1; int dItry, i, ndig = 0, r = 1; union { long double d; ULong bits[3]; } u, v[2]; while((s = fgets(ibuf, sizeof(ibuf), stdin))) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || (i >= '0' && i <= '9')) { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': /* sscanf(s+1, "%lx %lx %lx", &u.bits[_0], */ /* &u.bits[_1], &u.bits[_2]); */ u.bits[_0] = (ULong)strtoul(s1 = s+1, &se, 16); if (se > s1) { u.bits[_1] = (ULong)strtoul(s1=se, &se, 16); if (se > s1) u.bits[_2] = (ULong)strtoul(s1=se, &se, 16); } printf("\nInput: %s", ibuf); printf(" --> f = #%lx %lx %lx\n", U u.bits[_0], U u.bits[_1], U u.bits[_2]); goto fmt_test; } dItry = 1; printf("\nInput: %s", ibuf); i = strtorxL(ibuf, &se, r, u.bits); if (r == 1 && (i != strtopxL(ibuf, &se1, v[0].bits) || se1 != se || memcmp(u.bits, v[0].bits, 12))) printf("***strtoxL and strtorxL disagree!!\n:"); printf("\nstrtoxL consumes %d bytes and returns %d\n", (int)(se-ibuf), i); printf("with bits = #%lx %lx %lx\n", U u.bits[_0], U u.bits[_1], U u.bits[_2]); if (sizeof(long double) == 12) printf("printf(\"%%.21Lg\") gives %.21Lg\n", u.d); fmt_test: se = g_xLfmt(obuf, u.bits, ndig, sizeof(obuf)); printf("g_xLfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : "<null>"); if (!dItry) continue; printf("strtoIxL returns %d,", strtoIxL(ibuf, &se, v[0].bits, v[1].bits)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (!memcmp(v[0].bits, v[1].bits, 12)) { if (!memcmp(u.bits, v[0].bits, 12)) printf("fI[0] == fI[1] == strtoxL\n"); else { printf("fI[0] == fI[1] = #%lx %lx %lx\n", U v[0].bits[_0], U v[0].bits[_1], U v[0].bits[_2]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); } } else { printf("fI[0] = #%lx %lx %lx\n", U v[0].bits[_0], U v[0].bits[_1], U v[0].bits[_2]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); printf("fI[1] = #%lx %lx %lx\n", U v[1].bits[_0], U v[1].bits[_1], U v[1].bits[_2]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[1].d); if (!memcmp(v[0].bits, u.bits, 12)) printf("fI[0] == strtoxL\n"); else if (!memcmp(v[1].bits, u.bits, 12)) printf("fI[1] == strtoxL\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); } return 0; }
int main(Void) { char *s, *se, *se1; int i, dItry, ndig = 0, r = 1; union { long double d; UShort bits[5]; } u, v[2]; while(s = fgets(ibuf, sizeof(ibuf), stdin)) { while(*s <= ' ') if (!*s++) continue; dItry = 0; switch(*s) { case 'r': r = getround(r, s); continue; case 'n': i = s[1]; if (i <= ' ' || i >= '0' && i <= '9') { ndig = atoi(s+1); continue; } break; /* nan? */ case '#': sscanf(s+1, "%hx %hx %hx %hx %hx", &u.bits[_0], &u.bits[_1], &u.bits[_2], &u.bits[_3], &u.bits[_4]); printf("\nInput: %s", ibuf); printf(" --> f = #%x %x %x %x %x\n", u.bits[_0], u.bits[_1], u.bits[_2], u.bits[_3], u.bits[_4]); goto fmt_test; } dItry = 1; printf("\nInput: %s", ibuf); i = strtorx(ibuf, &se, r, u.bits); if (r == 1 && (i != strtopx(ibuf, &se1, v[0].bits) || se1 != se || memcmp(u.bits, v[0].bits, 10))) printf("***strtox and strtorx disagree!!\n:"); printf("\nstrtox consumes %d bytes and returns %d\n", (int)(se-ibuf), i); printf("with bits = #%x %x %x %x %x\n", u.bits[_0], u.bits[_1], u.bits[_2], u.bits[_3], u.bits[_4]); if (sizeof(long double) == 12) printf("printf(\"%%.21Lg\") gives %.21Lg\n", u.d); fmt_test: se = g_xfmt(obuf, u.bits, ndig, sizeof(obuf)); printf("g_xfmt(%d) gives %d bytes: \"%s\"\n\n", ndig, (int)(se-obuf), se ? obuf : "<null>"); if (!dItry) continue; printf("strtoIx returns %d,", strtoIx(ibuf, &se, v[0].bits, v[1].bits)); printf(" consuming %d bytes.\n", (int)(se-ibuf)); if (!memcmp(v[0].bits, v[1].bits, 10)) { if (!memcmp(u.bits, v[0].bits, 10)) printf("fI[0] == fI[1] == strtox\n"); else { printf("fI[0] == fI[1] = #%x %x %x %x %x\n", v[0].bits[_0], v[0].bits[_1], v[0].bits[_2], v[0].bits[_3], v[0].bits[_4]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); } } else { printf("fI[0] = #%x %x %x %x %x\n", v[0].bits[_0], v[0].bits[_1], v[0].bits[_2], v[0].bits[_3], v[0].bits[_4]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[0].d); printf("fI[1] = #%x %x %x %x %x\n", v[1].bits[_0], v[1].bits[_1], v[1].bits[_2], v[1].bits[_3], v[1].bits[_4]); if (sizeof(long double) == 12) printf("= %.21Lg\n", v[1].d); if (!memcmp(v[0].bits, u.bits, 10)) printf("fI[0] == strtox\n"); else if (!memcmp(v[1].bits, u.bits, 10)) printf("fI[1] == strtox\n"); else printf("**** Both differ from strtod ****\n"); } printf("\n"); } return 0; }