Example #1
0
/*
 * 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);
}
Example #2
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. */
}
Example #3
0
 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;
	}
Example #4
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;
	}
Example #5
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;
	}