Mercurial > hg > octave-shane > gnulib-hg
annotate lib/signbitl.c @ 17282:a4996fb12971
locale: port to Solaris 2.6 and 7 + GNU gettext
* lib/locale.in.h: Just include_next <locale.h> when
being invoked recursively. This prevents problems on Solaris 2.6 and 7
when combining the localename module with GNU gettext 0.18.2.
Problem reported by Tom G. Christensen in
<http://lists.gnu.org/archive/html/bug-gnulib/2013-01/msg00084.html>.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Thu, 10 Jan 2013 13:24:13 -0800 |
parents | e542fd46ad6f |
children | 344018b6e5d7 |
rev | line source |
---|---|
8652 | 1 /* signbit() macro: Determine the sign bit of a floating-point number. |
17249
e542fd46ad6f
maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents:
16201
diff
changeset
|
2 Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. |
8652 | 3 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8659
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify |
8652 | 5 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8659
diff
changeset
|
6 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8659
diff
changeset
|
7 (at your option) any later version. |
8652 | 8 |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8659
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8659
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
8652 | 16 |
17 #include <config.h> | |
18 | |
19 /* Specification. */ | |
20 #include <math.h> | |
21 | |
22 #include <string.h> | |
23 #include "isnanl-nolibm.h" | |
24 #include "float+.h" | |
25 | |
11525
0b09102d516e
Fix compilation error introduced on 2009-04-25.
Bruno Haible <bruno@clisp.org>
parents:
11506
diff
changeset
|
26 #ifdef gl_signbitl_OPTIMIZED_MACRO |
0b09102d516e
Fix compilation error introduced on 2009-04-25.
Bruno Haible <bruno@clisp.org>
parents:
11506
diff
changeset
|
27 # undef gl_signbitl |
0b09102d516e
Fix compilation error introduced on 2009-04-25.
Bruno Haible <bruno@clisp.org>
parents:
11506
diff
changeset
|
28 #endif |
0b09102d516e
Fix compilation error introduced on 2009-04-25.
Bruno Haible <bruno@clisp.org>
parents:
11506
diff
changeset
|
29 |
8652 | 30 int |
31 gl_signbitl (long double arg) | |
32 { | |
33 #if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT | |
8659
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
34 /* The use of a union to extract the bits of the representation of a |
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
35 'long double' is safe in practice, despite of the "aliasing rules" of |
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
36 C99, because the GCC docs say |
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
37 "Even with '-fstrict-aliasing', type-punning is allowed, provided the |
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
38 memory is accessed through the union type." |
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
39 and similarly for other compilers. */ |
8652 | 40 # define NWORDS \ |
41 ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) | |
42 union { long double value; unsigned int word[NWORDS]; } m; | |
43 m.value = arg; | |
44 return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; | |
8659
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
45 #elif HAVE_COPYSIGNL_IN_LIBC |
d6d05661430a
Use copysign when implementing signbit, if the libc has it already.
Bruno Haible <bruno@clisp.org>
parents:
8652
diff
changeset
|
46 return copysignl (1.0L, arg) < 0; |
8652 | 47 #else |
48 /* This does not do the right thing for NaN, but this is irrelevant for | |
49 most use cases. */ | |
50 if (isnanl (arg)) | |
51 return 0; | |
52 if (arg < 0.0L) | |
53 return 1; | |
54 else if (arg == 0.0L) | |
55 { | |
56 /* Distinguish 0.0L and -0.0L. */ | |
57 static long double plus_zero = 0.0L; | |
58 long double arg_mem = arg; | |
59 return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0); | |
60 } | |
61 else | |
62 return 0; | |
63 #endif | |
64 } |