Fix floating point unary minus and plus
negate(x) is subtract(-0,x), not subtract(+0,x), which makes a difference with signed zeros. Also +x was expressed as x+0, in order for the integer promotions to happen, but also mangles signed zeros, so just don't do that with floating types.
This commit is contained in:
@ -1699,6 +1699,29 @@ void prefix ## call(void)\
|
||||
printf("strto%s: %f\n", #prefix, (double)strto ## prefix("1.2", NULL));\
|
||||
}\
|
||||
\
|
||||
void prefix ## signed_zeros(void) \
|
||||
{\
|
||||
type x = 0.0, y = -0.0, n, p;\
|
||||
if (x == y)\
|
||||
printf ("Test 1.0 / x != 1.0 / y returns %d (should be 1).\n",\
|
||||
1.0 / x != 1.0 / y);\
|
||||
else\
|
||||
printf ("x != y; this is wrong!\n");\
|
||||
\
|
||||
n = -x;\
|
||||
if (x == n)\
|
||||
printf ("Test 1.0 / x != 1.0 / -x returns %d (should be 1).\n",\
|
||||
1.0 / x != 1.0 / n);\
|
||||
else\
|
||||
printf ("x != -x; this is wrong!\n");\
|
||||
\
|
||||
p = +y;\
|
||||
if (x == p)\
|
||||
printf ("Test 1.0 / x != 1.0 / +y returns %d (should be 1).\n",\
|
||||
1.0 / x != 1.0 / p);\
|
||||
else\
|
||||
printf ("x != +y; this is wrong!\n");\
|
||||
}\
|
||||
void prefix ## test(void)\
|
||||
{\
|
||||
printf("testing '%s'\n", #typename);\
|
||||
@ -1708,6 +1731,7 @@ void prefix ## test(void)\
|
||||
prefix ## fcast(234.6);\
|
||||
prefix ## fcast(-2334.6);\
|
||||
prefix ## call();\
|
||||
prefix ## signed_zeros();\
|
||||
}
|
||||
|
||||
FTEST(f, float, float, "%f")
|
||||
|
||||
Reference in New Issue
Block a user