|  | /** | 
|  | * This file has no copyright assigned and is placed in the Public Domain. | 
|  | * This file is part of the mingw-w64 runtime package. | 
|  | * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
|  | */ | 
|  | /* | 
|  | nexttoward.c | 
|  | Contributed by Danny Smith <dannysmith@users.sourceforge.net> | 
|  | No copyright claimed, absolutely no warranties. | 
|  |  | 
|  | 2005-05-10 | 
|  | */ | 
|  |  | 
|  | #include <math.h> | 
|  |  | 
|  | double | 
|  | nexttoward (double x, long double y) | 
|  | { | 
|  | union | 
|  | { | 
|  | double d; | 
|  | unsigned long long ll; | 
|  | } u; | 
|  |  | 
|  | long double xx = x; | 
|  |  | 
|  | if (isnan (y) || isnan (x)) | 
|  | return x + y; | 
|  |  | 
|  | if (xx == y) | 
|  | /* nextafter (0.0, -O.0) should return -0.0.  */ | 
|  | return y; | 
|  | u.d = x; | 
|  | if (x == 0.0) | 
|  | { | 
|  | u.ll = 1; | 
|  | return y > 0.0L ? u.d : -u.d; | 
|  | } | 
|  |  | 
|  | /* Non-extended encodings are lexicographically ordered, | 
|  | with implicit "normal" bit.  */ | 
|  | if (((x > 0.0) ^ (y > xx)) == 0) | 
|  | u.ll++; | 
|  | else | 
|  | u.ll--; | 
|  | return u.d; | 
|  | } |