This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] sqrt: Fix NaN propagation for IEEE Std 754-2008


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=96fc528397f02a8ac36cfd66179fed815d3ab527

commit 96fc528397f02a8ac36cfd66179fed815d3ab527
Author: Ray Donnelly <mingw.android@gmail.com>
Date:   Wed Apr 6 02:59:53 2016 +0100

    sqrt: Fix NaN propagation for IEEE Std 754-2008
    
    The R language has some hacks specifically for mingw-w64 that
    were caused by our handling of NaNs in sqrt(x). R uses a
    special valued NaN to mean 'Not Available' and expects it to
    be retained through various calculations. Our sqrt(x) doesn't
    do this, instead it normalises such a NaN (retaining sign).
    
    From:
    
    http://wwwf.imperial.ac.uk/~drmii/M3SC_2016/IEEE_2008_4610935.pdf
    
    "6.2.3 NaN propagation
    
    An operation that propagates a NaN operand to its result and
    has a single NaN as an input should produce a NaN with the
    payload of the input NaN if representable in the destination
    format."
    
    There might even be a slight speed-up from this too.
    
    Thanks to Duncan Murdoch for finding the reference.

Diff:
---
 winsup/cygwin/math/sqrt.def.h | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/winsup/cygwin/math/sqrt.def.h b/winsup/cygwin/math/sqrt.def.h
index 1048130..2690d1d 100644
--- a/winsup/cygwin/math/sqrt.def.h
+++ b/winsup/cygwin/math/sqrt.def.h
@@ -73,9 +73,8 @@ __FLT_ABI (sqrt) (__FLT_TYPE x)
       if (x_class == FP_ZERO)
 	return __FLT_CST (-0.0);
 
-      res = (signbit (x) ? -__FLT_NAN : __FLT_NAN);
-      __FLT_RPT_DOMAIN ("sqrt", x, 0.0, res);
-      return res;
+      __FLT_RPT_DOMAIN ("sqrt", x, 0.0, x);
+      return x;
     }
   else if (x_class == FP_ZERO)
     return __FLT_CST (0.0);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]