Commit d2da4af2 by Janis Johnson Committed by Janis Johnson

re PR c/41049 (conversion from integer to decimal float loses trailing zeros)

gcc/
	PR c/41049
	* real.c decimal_from_integer, decimal_integer_string): New.
	(real_from_integer): Use them as special case for decimal float.
	* config/dfp-bit.c (_si_to_sd, _usi_to_sd): Use default rounding.
	(_di_to_sd, _di_to_dd, _di_to_td, _udi_to_sd, _udi_to_dd, _udi_to_td):
	Do not append zero after the decimal point in string to convert.
gcc/testsuite/
	PR c/41049
	* dfp/pr41049.c: New test.

From-SVN: r151806
parent 51a0d6aa
2009-09-17 Janis Johnson <janis187@us.ibm.com>
PR c/41049
* real.c decimal_from_integer, decimal_integer_string): New.
(real_from_integer): Use them as special case for decimal float.
* config/dfp-bit.c (_si_to_sd, _usi_to_sd): Use default rounding.
(_di_to_sd, _di_to_dd, _di_to_td, _udi_to_sd, _udi_to_dd, _udi_to_td):
Do not append zero after the decimal point in string to convert.
2009-09-17 Alexander Monakov <amonakov@ispras.ru>
* graphite-sese-to-poly.c (pdr_add_data_dimensions): Add bounds only
......
......@@ -568,7 +568,6 @@ INT_TO_DFP (INT_TYPE i)
decContext context;
decContextDefault (&context, DEC_INIT_DECIMAL128);
context.round = DEC_ROUND_DOWN;
f64 = *DEC_FLOAT_FROM_INT (&f64, i);
u32.f = *decSingleFromWider (&u32.f, &f64, &context);
if (DFP_EXCEPTIONS_ENABLED && context.status != 0)
......@@ -593,7 +592,7 @@ INT_TO_DFP (INT_TYPE i)
DFP_INIT_ROUNDMODE (context.round);
/* Use a C library function to get a floating point string. */
sprintf (buf, INT_FMT ".0", CAST_FOR_FMT(i));
sprintf (buf, INT_FMT ".", CAST_FOR_FMT(i));
/* Convert from the floating point string to a decimal* type. */
FROM_STRING (&s, buf, &context);
IEEE_TO_HOST (s, &f);
......
......@@ -110,6 +110,9 @@ static int do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
static void do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
static unsigned long rtd_divmod (REAL_VALUE_TYPE *, REAL_VALUE_TYPE *);
static void decimal_from_integer (REAL_VALUE_TYPE *);
static void decimal_integer_string (char *, const REAL_VALUE_TYPE *,
size_t);
static const REAL_VALUE_TYPE * ten_to_ptwo (int);
static const REAL_VALUE_TYPE * ten_to_mptwo (int);
......@@ -2168,10 +2171,70 @@ real_from_integer (REAL_VALUE_TYPE *r, enum machine_mode mode,
normalize (r);
}
if (mode != VOIDmode)
if (DECIMAL_FLOAT_MODE_P (mode))
decimal_from_integer (r);
else if (mode != VOIDmode)
real_convert (r, mode, r);
}
/* Render R, an integral value, as a floating point constant with no
specified exponent. */
static void
decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig,
size_t buf_size)
{
int dec_exp, digit, digits;
REAL_VALUE_TYPE r, pten;
char *p;
bool sign;
r = *r_orig;
if (r.cl == rvc_zero)
{
strcpy (str, "0.");
return;
}
sign = r.sign;
r.sign = 0;
dec_exp = REAL_EXP (&r) * M_LOG10_2;
digits = dec_exp + 1;
gcc_assert ((digits + 2) < (int)buf_size);
pten = *real_digit (1);
times_pten (&pten, dec_exp);
p = str;
if (sign)
*p++ = '-';
digit = rtd_divmod (&r, &pten);
gcc_assert (digit >= 0 && digit <= 9);
*p++ = digit + '0';
while (--digits > 0)
{
times_pten (&r, 1);
digit = rtd_divmod (&r, &pten);
*p++ = digit + '0';
}
*p++ = '.';
*p++ = '\0';
}
/* Convert a real with an integral value to decimal float. */
static void
decimal_from_integer (REAL_VALUE_TYPE *r)
{
char str[256];
decimal_integer_string (str, r, sizeof (str) - 1);
decimal_real_from_string (r, str);
}
/* Returns 10**2**N. */
static const REAL_VALUE_TYPE *
......
2009-09-17 Janis Johnson <janis187@us.ibm.com>
PR c/41049
* dfp/pr41049.c: New test.
2009-09-17 H.J. Lu <hongjiu.lu@intel.com>
PR testsuite/41385
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment