Mercurial > hg > octave-kai > gnulib-hg
annotate lib/ceil.c @ 17463:203c036eb0c6
bootstrap: support checksum utils without a --status option
* build-aux/bootstrap: Only look for sha1sum if updating po files.
Add sha1 to the list of supported checksum utils since it's now
supported through adjustments below.
(update_po_files): Remove the use of --status
in a way that will suppress all error messages, but since this is
only used to minimize updates, it shouldn't cause an issue.
Exit early if there is a problem updating the po file checksums.
(find_tool): Remove the check for --version support as this
is optional as per commit 86186b17. Don't even check for the
presence of the command as if that is needed, it's supported
through configuring prerequisites in bootstrap.conf.
Prompt that when a tool isn't found, one can define an environment
variable to add to the hardcoded search list.
author | Pádraig Brady <P@draigBrady.com> |
---|---|
date | Thu, 08 Aug 2013 11:08:49 +0100 (2013-08-08) |
parents | e542fd46ad6f |
children |
rev | line source |
---|---|
9295 | 1 /* Round towards positive infinity. |
17249
e542fd46ad6f
maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents:
16506
diff
changeset
|
2 Copyright (C) 2007, 2010-2013 Free Software Foundation, Inc. |
9295 | 3 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
9295
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify |
9295 | 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:
9295
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:
9295
diff
changeset
|
7 (at your option) any later version. |
9295 | 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:
9295
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:
9295
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
9295 | 16 |
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */ | |
18 | |
15925
e9d2edcbd10e
ceill: Simplify for platforms where 'long double' == 'double'.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
19 #if ! defined USE_LONG_DOUBLE |
e9d2edcbd10e
ceill: Simplify for platforms where 'long double' == 'double'.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
20 # include <config.h> |
e9d2edcbd10e
ceill: Simplify for platforms where 'long double' == 'double'.
Bruno Haible <bruno@clisp.org>
parents:
14079
diff
changeset
|
21 #endif |
9295 | 22 |
23 /* Specification. */ | |
24 #include <math.h> | |
25 | |
26 #include <float.h> | |
27 | |
14018
ac9f59901721
ceil, trunc, round: Fix gcc warnings.
Bruno Haible <bruno@clisp.org>
parents:
13992
diff
changeset
|
28 #undef MIN |
ac9f59901721
ceil, trunc, round: Fix gcc warnings.
Bruno Haible <bruno@clisp.org>
parents:
13992
diff
changeset
|
29 |
9295 | 30 #ifdef USE_LONG_DOUBLE |
31 # define FUNC ceill | |
32 # define DOUBLE long double | |
33 # define MANT_DIG LDBL_MANT_DIG | |
13992
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
34 # define MIN LDBL_MIN |
9295 | 35 # define L_(literal) literal##L |
36 #elif ! defined USE_FLOAT | |
37 # define FUNC ceil | |
38 # define DOUBLE double | |
39 # define MANT_DIG DBL_MANT_DIG | |
13992
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
40 # define MIN DBL_MIN |
9295 | 41 # define L_(literal) literal |
42 #else /* defined USE_FLOAT */ | |
43 # define FUNC ceilf | |
44 # define DOUBLE float | |
45 # define MANT_DIG FLT_MANT_DIG | |
13992
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
46 # define MIN FLT_MIN |
9295 | 47 # define L_(literal) literal##f |
48 #endif | |
49 | |
13992
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
50 /* -0.0. See minus-zero.h. */ |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
51 #if defined __hpux || defined __sgi || defined __ICC |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
52 # define MINUS_ZERO (-MIN * MIN) |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
53 #else |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
54 # define MINUS_ZERO L_(-0.0) |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
55 #endif |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
56 |
16506
fa4e9b981eb4
Avoid compilation errors with MSVC option -fp:strict.
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
57 /* MSVC with option -fp:strict refuses to compile constant initializers that |
fa4e9b981eb4
Avoid compilation errors with MSVC option -fp:strict.
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
58 contain floating-point operations. Pacify this compiler. */ |
fa4e9b981eb4
Avoid compilation errors with MSVC option -fp:strict.
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
59 #ifdef _MSC_VER |
fa4e9b981eb4
Avoid compilation errors with MSVC option -fp:strict.
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
60 # pragma fenv_access (off) |
fa4e9b981eb4
Avoid compilation errors with MSVC option -fp:strict.
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
61 #endif |
fa4e9b981eb4
Avoid compilation errors with MSVC option -fp:strict.
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
62 |
9295 | 63 /* 2^(MANT_DIG-1). */ |
9313 | 64 static const DOUBLE TWO_MANT_DIG = |
9295 | 65 /* Assume MANT_DIG <= 5 * 31. |
66 Use the identity | |
67 n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */ | |
68 (DOUBLE) (1U << ((MANT_DIG - 1) / 5)) | |
69 * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5)) | |
70 * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5)) | |
71 * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5)) | |
72 * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5)); | |
73 | |
74 DOUBLE | |
75 FUNC (DOUBLE x) | |
76 { | |
77 /* The use of 'volatile' guarantees that excess precision bits are dropped | |
78 at each addition step and before the following comparison at the caller's | |
79 site. It is necessary on x86 systems where double-floats are not IEEE | |
80 compliant by default, to avoid that the results become platform and compiler | |
81 option dependent. 'volatile' is a portable alternative to gcc's | |
82 -ffloat-store option. */ | |
83 volatile DOUBLE y = x; | |
84 volatile DOUBLE z = y; | |
85 | |
86 if (z > L_(0.0)) | |
87 { | |
9335
5f9727c11975
Fix incorrect rounding of ceil, ceilf, ceill in some cases. Add new test.
Bruno Haible <bruno@clisp.org>
parents:
9313
diff
changeset
|
88 /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */ |
5f9727c11975
Fix incorrect rounding of ceil, ceilf, ceill in some cases. Add new test.
Bruno Haible <bruno@clisp.org>
parents:
9313
diff
changeset
|
89 if (z < TWO_MANT_DIG) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
90 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
91 /* Round to the next integer (nearest or up or down, doesn't matter). */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
92 z += TWO_MANT_DIG; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
93 z -= TWO_MANT_DIG; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
94 /* Enforce rounding up. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
95 if (z < y) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
96 z += L_(1.0); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
97 } |
9295 | 98 } |
99 else if (z < L_(0.0)) | |
100 { | |
13992
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
101 /* For -1 < x < 0, return -0.0 regardless of the current rounding |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
102 mode. */ |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
103 if (z > L_(-1.0)) |
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
104 z = MINUS_ZERO; |
9335
5f9727c11975
Fix incorrect rounding of ceil, ceilf, ceill in some cases. Add new test.
Bruno Haible <bruno@clisp.org>
parents:
9313
diff
changeset
|
105 /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */ |
13992
749c72ade953
ceil: Implement result sign according to IEEE 754.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
106 else if (z > - TWO_MANT_DIG) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
107 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
108 /* Round to the next integer (nearest or up or down, doesn't matter). */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
109 z -= TWO_MANT_DIG; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
110 z += TWO_MANT_DIG; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
111 /* Enforce rounding up. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
112 if (z < y) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
113 z += L_(1.0); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9335
diff
changeset
|
114 } |
9295 | 115 } |
116 return z; | |
117 } |