mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-06 14:10:30 +08:00
(fcvt_r): Remove code which tries to use libm
functions. Reduce error in computing normalized value by multiplying factor in loop and compute result in one step.
This commit is contained in:
parent
76af51ff58
commit
d24d4112b6
@ -141,10 +141,6 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define weak_extern2(name) weak_extern (name)
|
||||
weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
|
||||
weak_extern2 (EXP)
|
||||
|
||||
int
|
||||
APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
|
||||
FLOAT_TYPE value;
|
||||
@ -156,46 +152,34 @@ APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
|
||||
|
||||
if (!ISNAN (value) && !ISINF (value) && value != 0.0)
|
||||
{
|
||||
FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
|
||||
|
||||
if (log10_function)
|
||||
{
|
||||
/* Use the reasonable code if -lm is included. */
|
||||
FLOAT_TYPE dexponent;
|
||||
dexponent = FLOOR (LOG10 (FABS (value)));
|
||||
value *= EXP (dexponent * -M_LN10);
|
||||
exponent = (int) dexponent;
|
||||
}
|
||||
/* Slow code that doesn't require -lm functions. */
|
||||
FLOAT_TYPE d;
|
||||
FLOAT_TYPE f = 1.0;
|
||||
if (value < 0.0)
|
||||
d = -value;
|
||||
else
|
||||
d = value;
|
||||
if (d < 1.0)
|
||||
{
|
||||
/* Slow code that doesn't require -lm functions. */
|
||||
FLOAT_TYPE d;
|
||||
if (value < 0.0)
|
||||
d = -value;
|
||||
else
|
||||
d = value;
|
||||
if (d < 1.0)
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
d *= 10.0;
|
||||
--exponent;
|
||||
}
|
||||
while (d < 1.0);
|
||||
f *= 10.0;
|
||||
--exponent;
|
||||
}
|
||||
else if (d >= 10.0)
|
||||
while (d * f < 1.0);
|
||||
|
||||
value *= f;
|
||||
}
|
||||
else if (d >= 10.0)
|
||||
{
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
d *= 0.1;
|
||||
++exponent;
|
||||
}
|
||||
while (d >= 10.0);
|
||||
f *= 10.0;
|
||||
++exponent;
|
||||
}
|
||||
if (value < 0.0)
|
||||
value = -d;
|
||||
else
|
||||
value = d;
|
||||
while (d >= f * 10.0);
|
||||
|
||||
value /= f;
|
||||
}
|
||||
}
|
||||
else if (value == 0.0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user