+2016-10-28 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #19380]
+ * stdlib/strtod_l.c (round_and_return): Force "inexact" exception
+ for inexact results.
+ * stdlib/gen-tst-strtod-round.c (string_to_fp): Return indication
+ of inexact result where mpfr_subnormalize is the only inexact
+ step.
+ * stdlib/tst-strtod-round-data.h: Regenerated.
+ * stdlib/tst-strtod-round-skeleton.c [!FE_INEXACT] (FE_INEXACT):
+ Define to 0.
+ (GEN_ONE_TEST): Test inexact exceptions raised are as expected.
+
2016-10-27 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/sys/user.h: Include stddef.h
mpfr_init2 (f2, 100000);
int r0 = mpfr_strtofr (f2, s, NULL, 0, rnd);
int r = mpfr_set (f, f2, rnd);
- mpfr_subnormalize (f, r, rnd);
+ r |= mpfr_subnormalize (f, r, rnd);
mpfr_clear (f2);
return r0 | r;
#else
int r = mpfr_strtofr (f, s, NULL, 0, rnd);
- mpfr_subnormalize (f, r, rnd);
+ r |= mpfr_subnormalize (f, r, rnd);
return r;
#endif
}
if (exponent > MAX_EXP)
goto overflow;
+ bool half_bit = (round_limb & (((mp_limb_t) 1) << round_bit)) != 0;
+ bool more_bits_nonzero
+ = (more_bits
+ || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0);
if (round_away (negative,
(retval[0] & 1) != 0,
- (round_limb & (((mp_limb_t) 1) << round_bit)) != 0,
- (more_bits
- || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0),
+ half_bit,
+ more_bits_nonzero,
mode))
{
mp_limb_t cy = __mpn_add_1 (retval, retval, RETURN_LIMB_SIZE, 1);
overflow:
return overflow_value (negative);
+ if (half_bit || more_bits_nonzero)
+ {
+ FLOAT force_inexact = (FLOAT) 1 + MIN_VALUE;
+ math_force_eval (force_inexact);
+ }
return MPN2FLOAT (retval, exponent, negative);
}
TEST ("0.0000000000000000000000000000000000000000000021019476964872"
"256063855943749348741969203929128147736576356024258346866240"
"28790902229957282543182373046875",
- true,
+ false,
0x8p-152,
0x1p-148,
0x8p-152,
0xcp-152),
TEST ("2.1019476964872256063855943749348741969203929128147736576356"
"02425834686624028790902229957282543182373046875e-45",
- true,
+ false,
0x8p-152,
0x1p-148,
0x8p-152,
-0xb.fffffffffffffffffffffffffff8p-152),
TEST ("-2.101947696487225606385594374934874196920392912814773657635"
"602425834686624028790902229957282543182373046875e-45",
- true,
+ false,
-0x1p-148,
-0x1p-148,
-0x8p-152,
0x1.4p-148),
TEST ("3.5032461608120426773093239582247903282006548546912894293926"
"70709724477706714651503716595470905303955078125e-45",
- true,
+ false,
0x1p-148,
0x1p-148,
0x1p-148,
-0x1.3fffffffffffffffffffffffffffp-148),
TEST ("-3.503246160812042677309323958224790328200654854691289429392"
"670709724477706714651503716595470905303955078125e-45",
- true,
+ false,
-0x1.8p-148,
-0x1p-148,
-0x1p-148,
0x0p+0,
0x0p+0,
0x8p-152,
- true,
+ false,
0x4p-1076,
0x8p-1076,
0x4p-1076,
0x6p-1076,
0x6p-1076,
0x6p-1076,
- true,
+ false,
0x4p-1076,
0x8p-1076,
0x4p-1076,
-0x0p+0,
-0x0p+0,
-0x0p+0,
- true,
+ false,
-0x8p-1076,
-0x8p-1076,
-0x4p-1076,
-0x6p-1076,
-0x6p-1076,
-0x6p-1076,
- true,
+ false,
-0x8p-1076,
-0x8p-1076,
-0x4p-1076,
0x0p+0,
0x0p+0,
0x4p-1076,
- true,
+ false,
0x8p-16448,
0x1p-16444,
0x8p-16448,
-0x0p+0,
-0x0p+0,
-0x0p+0,
- true,
+ false,
-0x1p-16444,
-0x1p-16444,
-0x8p-16448,
0x0p+0,
0x0p+0,
0x4p-1076,
- true,
+ false,
0x8p-16448,
0x1p-16444,
0x8p-16448,
-0x0p+0,
-0x0p+0,
-0x0p+0,
- true,
+ false,
-0x1p-16444,
-0x1p-16444,
-0x8p-16448,
#define STR(x) STRX (x)
#define FNPFXS STR (FNPFX)
+#ifndef FE_INEXACT
+# define FE_INEXACT 0
+#endif
+
#define GEN_ONE_TEST(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \
{ \
+ feclearexcept (FE_INEXACT); \
FTYPE f = STRTO (FSUF) (s, NULL); \
if (f != expected->FSUF \
|| (copysign ## CSUF) (1.0 ## LSUF, f) \
else \
printf ("ignoring this inexact result\n"); \
} \
+ else if (FE_INEXACT != 0) \
+ { \
+ bool inexact_raised = fetestexcept (FE_INEXACT) != 0; \
+ if (inexact_raised != !exact->FSUF) \
+ { \
+ printf (FNPFXS "to" #FSUF " (" STRM ") inexact %d " \
+ "not %d\n", s, inexact_raised, !exact->FSUF); \
+ if (EXCEPTION_TESTS (FTYPE)) \
+ result = 1; \
+ else \
+ printf ("ignoring this exception error\n"); \
+ } \
+ } \
}
static int