提交 bff78954 编写于 作者: R Rich Felker

fix incorrect use of fabs on long double operand in floatscan.c

based on patch by Dan Gohman, who caught this via compiler warnings.
analysis by Szabolcs Nagy determined that it's a bug, whereby errno
can be set incorrectly for values where the coercion from long double
to double causes rounding. it seems likely that floating point status
flags may be set incorrectly as a result too.

at the same time, clean up use of preprocessor concatenation involving
LDBL_MANT_DIG, which spuriously depends on it being a single unadorned
decimal integer literal, and instead use the equivalent formulation
2/LDBL_EPSILON. an equivalent change on the printf side was made in
commit bff6095d.
上级 2d3083e7
...@@ -33,9 +33,6 @@ ...@@ -33,9 +33,6 @@
#define MASK (KMAX-1) #define MASK (KMAX-1)
#define CONCAT2(x,y) x ## y
#define CONCAT(x,y) CONCAT2(x,y)
static long long scanexp(FILE *f, int pok) static long long scanexp(FILE *f, int pok)
{ {
int c; int c;
...@@ -301,7 +298,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po ...@@ -301,7 +298,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
y -= bias; y -= bias;
if ((e2+LDBL_MANT_DIG & INT_MAX) > emax-5) { if ((e2+LDBL_MANT_DIG & INT_MAX) > emax-5) {
if (fabs(y) >= CONCAT(0x1p, LDBL_MANT_DIG)) { if (fabsl(y) >= 2/LDBL_EPSILON) {
if (denormal && bits==LDBL_MANT_DIG+e2-emin) if (denormal && bits==LDBL_MANT_DIG+e2-emin)
denormal = 0; denormal = 0;
y *= 0.5; y *= 0.5;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册