[newlib-cygwin/cygwin-3_5-branch] libm/common: Fix nextafter and nextafterf when x == y
Corinna Vinschen
corinna@sourceware.org
Thu Dec 5 10:58:20 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=bbf8484a5b4fb5bcae024c04a8d84e53834e8b79
commit bbf8484a5b4fb5bcae024c04a8d84e53834e8b79
Author: Kito Cheng <kito.cheng@sifive.com>
AuthorDate: Thu Dec 5 16:39:56 2024 +0800
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Thu Dec 5 11:57:37 2024 +0100
libm/common: Fix nextafter and nextafterf when x == y
That according to C99/POSIX, nextafter(x,y) should return y if x==y.
[1] NetBSD fix for this: https://github.com/IIJ-NetBSD/netbsd-src/commit/3bc685224189d2b7dfb68da52d9725a256a667bd
[2] glibc fix for this: https://github.com/bminor/glibc/commit/bc9f6000f6752153e5e1902259d5f491a88a1ae5#diff-bcc0628a39c3c2003047dcb5a40a8b50c00f01a74b1c8c1100d770a8e48b1ce2
[3] Linux man page: https://man7.org/linux/man-pages/man3/nextafter.3.html
(cherry picked from commit 7ccfe49e8ce908c581f82c8dbf0f9064df488a24)
Diff:
---
newlib/libm/common/s_nextafter.c | 2 +-
newlib/libm/common/sf_nextafter.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/newlib/libm/common/s_nextafter.c b/newlib/libm/common/s_nextafter.c
index 9453a0a0015d..356c79f3de22 100644
--- a/newlib/libm/common/s_nextafter.c
+++ b/newlib/libm/common/s_nextafter.c
@@ -70,7 +70,7 @@ PORTABILITY
if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */
((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) /* y is nan */
return x+y;
- if(x==y) return x; /* x=y, return x */
+ if(x==y) return y; /* x=y, return y */
if((ix|lx)==0) { /* x == 0 */
INSERT_WORDS(x,hy&0x80000000,1); /* return +-minsubnormal */
y = x*x;
diff --git a/newlib/libm/common/sf_nextafter.c b/newlib/libm/common/sf_nextafter.c
index cea4da58ddcf..cdc7c663dfc2 100644
--- a/newlib/libm/common/sf_nextafter.c
+++ b/newlib/libm/common/sf_nextafter.c
@@ -32,7 +32,7 @@
if(FLT_UWORD_IS_NAN(ix) ||
FLT_UWORD_IS_NAN(iy))
return x+y;
- if(x==y) return x; /* x=y, return x */
+ if(x==y) return y; /* x=y, return y */
if(FLT_UWORD_IS_ZERO(ix)) { /* x == 0 */
SET_FLOAT_WORD(x,(hy&0x80000000)|FLT_UWORD_MIN);
y = x*x;
More information about the Newlib-cvs
mailing list