1 /* Return 1 if argument is a NaN, else 0.
2    Copyright (C) 2007-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library.  If not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 /* Ugly kludge to avoid declarations.  */
20 #define __isnanf	not___isnanf
21 #define isnanf		not_isnanf
22 #define __GI___isnanf	not__GI___isnanf
23 
24 #include <math.h>
25 #include <math_private.h>
26 #include <math_ldbl_opt.h>
27 
28 #undef __isnanf
29 #undef isnanf
30 #undef __GI___isnanf
31 
32 int
__isnan(double x)33 __isnan (double x)
34 {
35   uint64_t ix;
36   EXTRACT_WORDS64 (ix, x);
37   return ix * 2 > 0xffe0000000000000ul;
38 }
39 
40 hidden_def (__isnan)
41 weak_alias (__isnan, isnan)
42 
43 /* It turns out that the 'double' version will also always work for
44    single-precision.  */
45 strong_alias (__isnan, __isnanf)
46 weak_alias (__isnan, isnanf)
47 
48 /* ??? GCC 4.8 fails to look through chains of aliases with asm names
49    attached.  Work around this for now.  */
50 hidden_ver (__isnan, __isnanf)
51 
52 #ifdef NO_LONG_DOUBLE
53 strong_alias (__isnan, __isnanl)
54 weak_alias (__isnan, isnanl)
55 #endif
56 #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
57 compat_symbol (libc, __isnan, __isnanl, GLIBC_2_0);
58 compat_symbol (libc, isnan, isnanl, GLIBC_2_0);
59 #endif
60