* floatformat.c (floatformat_to_double): Correctly handle numbers
between 1 and 2. Simplify handling of denormal number.
(main): Test with 1.1.
From-SVN: r190493
+2012-08-17 Andreas Schwab <schwab@linux-m68k.org>
+
+ * floatformat.c (floatformat_to_double): Correctly handle numbers
+ between 1 and 2. Simplify handling of denormal number.
+ (main): Test with 1.1.
+
2012-07-31 Mike Frysinger <vapier@gentoo.org>
* md5.c (md5_finish_ctx): Declare swap_bytes. Assign SWAP() output
2012-07-31 Mike Frysinger <vapier@gentoo.org>
* md5.c (md5_finish_ctx): Declare swap_bytes. Assign SWAP() output
/* IEEE floating point support routines, for GDB, the GNU Debugger.
/* 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.
Free Software Foundation, Inc.
This file is part of GDB.
unsigned long mant;
unsigned int mant_bits, mant_off;
int mant_bits_left;
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
/* Split values are not handled specially, since the top half has
the correctly rounded double value (in the only supported case of
mant_off = fmt->man_start;
dto = 0.0;
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. */
/* 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
if (fmt->intbit == floatformat_intbit_no)
dto = ldexp (1.0, exponent);
else
mant = get_field (ufrom, fmt->byteorder, fmt->totalsize,
mant_off, mant_bits);
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;
}
mant_off += mant_bits;
mant_bits_left -= mant_bits;
}
{
ieee_test (0.0);
ieee_test (0.5);
{
ieee_test (0.0);
ieee_test (0.5);
ieee_test (256.0);
ieee_test (0.12345);
ieee_test (234235.78907234);
ieee_test (256.0);
ieee_test (0.12345);
ieee_test (234235.78907234);