{
if (isnan(got) && isnan(want))
return 0;
- if (got == want && signbit(got) == signbit(want))
- return dwant;
+ if (got == want) {
+ if (signbit(got) == signbit(want))
+ return dwant;
+ return inf;
+ }
if (isinf(got)) {
got = copysignf(0x1p127, got);
want *= 0.5;
{
if (isnan(got) && isnan(want))
return 0;
- if (got == want && signbit(got) == signbit(want))
- return dwant;
+ if (got == want) {
+ if (signbit(got) == signbit(want))
+ return dwant;
+ return inf; // treat 0 sign errors badly
+ }
if (isinf(got)) {
got = copysign(0x1p1023, got);
want *= 0.5;
#elif LDBL_MANT_DIG == 64
if (isnan(got) && isnan(want))
return 0;
- if (got == want && signbit(got) == signbit(want))
- return dwant;
+ if (got == want) {
+ if (signbit(got) == signbit(want))
+ return dwant;
+ return inf;
+ }
if (isinf(got)) {
got = copysignl(0x1p16383L, got);
want *= 0.5;
{
switch (r) {
case RN: return "RN";
+#ifdef FE_TOWARDZERO
case RZ: return "RZ";
+#endif
+#ifdef FE_UPWARD
case RU: return "RU";
+#endif
+#ifdef FE_DOWNWARD
case RD: return "RD";
+#endif
}
return "R?";
}
-
-void setupfenv(int r)
-{
- fesetround(r);
- feclearexcept(FE_ALL_EXCEPT);
-}
-
-int getexcept(void)
-{
- return fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW);
-}
-