diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2012-08-17 21:59:31 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2012-08-17 21:59:31 +0000 |
commit | e372c21ce5de68fdfd90230d8f6d4f106973d19e (patch) | |
tree | 4eae9af114cff3c5926bf32eb6efc5ca07c01b22 /libiberty/floatformat.c | |
parent | db7618108f99d46abdb66638f9a52a80e9264503 (diff) | |
download | gdb-e372c21ce5de68fdfd90230d8f6d4f106973d19e.zip gdb-e372c21ce5de68fdfd90230d8f6d4f106973d19e.tar.gz gdb-e372c21ce5de68fdfd90230d8f6d4f106973d19e.tar.bz2 |
* floatformat.c (floatformat_to_double): Correctly handle numbers
between 1 and 2. Simplify handling of denormal number.
(main): Test with 1.1.
Diffstat (limited to 'libiberty/floatformat.c')
-rw-r--r-- | libiberty/floatformat.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/libiberty/floatformat.c b/libiberty/floatformat.c index 1116c63..c58ab01 100644 --- a/libiberty/floatformat.c +++ b/libiberty/floatformat.c @@ -1,5 +1,5 @@ /* IEEE floating point support routines, for GDB, the GNU Debugger. - Copyright 1991, 1994, 1999, 2000, 2003, 2005, 2006, 2010 + Copyright 1991, 1994, 1999, 2000, 2003, 2005, 2006, 2010, 2012 Free Software Foundation, Inc. This file is part of GDB. @@ -463,7 +463,6 @@ floatformat_to_double (const struct floatformat *fmt, unsigned long mant; unsigned int mant_bits, mant_off; int mant_bits_left; - int special_exponent; /* It's a NaN, denorm or zero */ /* Split values are not handled specially, since the top half has the correctly rounded double value (in the only supported case of @@ -503,20 +502,20 @@ floatformat_to_double (const struct floatformat *fmt, mant_off = fmt->man_start; dto = 0.0; - special_exponent = exponent == 0 || (unsigned long) exponent == fmt->exp_nan; - - /* Don't bias zero's, denorms or NaNs. */ - if (!special_exponent) - exponent -= fmt->exp_bias; - /* Build the result algebraically. Might go infinite, underflow, etc; who cares. */ - /* If this format uses a hidden bit, explicitly add it in now. Otherwise, - increment the exponent by one to account for the integer bit. */ - - if (!special_exponent) + /* For denorms use minimum exponent. */ + if (exponent == 0) + exponent = 1 - fmt->exp_bias; + else { + exponent -= fmt->exp_bias; + + /* If this format uses a hidden bit, explicitly add it in now. + Otherwise, increment the exponent by one to account for the + integer bit. */ + if (fmt->intbit == floatformat_intbit_no) dto = ldexp (1.0, exponent); else @@ -530,18 +529,8 @@ floatformat_to_double (const struct floatformat *fmt, mant = get_field (ufrom, fmt->byteorder, fmt->totalsize, mant_off, mant_bits); - /* Handle denormalized numbers. FIXME: What should we do for - non-IEEE formats? */ - if (special_exponent && exponent == 0 && mant != 0) - dto += ldexp ((double)mant, - (- fmt->exp_bias - - mant_bits - - (mant_off - fmt->man_start) - + 1)); - else - dto += ldexp ((double)mant, exponent - mant_bits); - if (exponent != 0) - exponent -= mant_bits; + dto += ldexp ((double) mant, exponent - mant_bits); + exponent -= mant_bits; mant_off += mant_bits; mant_bits_left -= mant_bits; } @@ -756,6 +745,7 @@ main (void) { ieee_test (0.0); ieee_test (0.5); + ieee_test (1.1); ieee_test (256.0); ieee_test (0.12345); ieee_test (234235.78907234); |