Mercurial > gnulib
annotate tests/test-sqrtl.c @ 40186:8964917f9574
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Mon, 18 Feb 2019 08:02:49 -0800 |
parents | b06060465f09 |
children |
rev | line source |
---|---|
12760 | 1 /* Test of sqrtl() function. |
40057
b06060465f09
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
19484
diff
changeset
|
2 Copyright (C) 2010-2019 Free Software Foundation, Inc. |
12760 | 3 |
4 This program is free software: you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 3 of the License, or | |
7 (at your option) any later version. | |
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 | |
14 You should have received a copy of the GNU General Public License | |
19190 | 15 along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
12760 | 16 |
17 /* Written by Bruno Haible <bruno@clisp.org>, 2010. */ | |
18 | |
19 #include <config.h> | |
20 | |
21 #include <math.h> | |
22 | |
23 #include "signature.h" | |
24 SIGNATURE_CHECK (sqrtl, long double, (long double)); | |
25 | |
16570 | 26 #include <float.h> |
27 | |
12760 | 28 #include "fpucw.h" |
29 #include "macros.h" | |
30 | |
16570 | 31 #define DOUBLE long double |
32 #define L_(literal) literal##L | |
33 #define MANT_DIG DBL_MANT_DIG | |
34 #define SQRT sqrtl | |
35 #define RANDOM randoml | |
36 #include "test-sqrt.h" | |
12760 | 37 |
16697
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
38 static long double |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
39 my_ldexpl (long double x, int d) |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
40 { |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
41 for (; d > 0; d--) |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
42 x *= 2.0L; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
43 for (; d < 0; d++) |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
44 x *= 0.5L; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
45 return x; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
46 } |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
47 |
12760 | 48 int |
49 main () | |
50 { | |
51 DECL_LONG_DOUBLE_ROUNDING | |
52 | |
53 BEGIN_LONG_DOUBLE_ROUNDING (); | |
54 | |
55 /* A particular value. */ | |
12776
bebb37f7d22e
Tests: Defeat inlining of math functions by GCC >= 4.3.0.
Bruno Haible <bruno@clisp.org>
parents:
12760
diff
changeset
|
56 x = 0.6L; |
bebb37f7d22e
Tests: Defeat inlining of math functions by GCC >= 4.3.0.
Bruno Haible <bruno@clisp.org>
parents:
12760
diff
changeset
|
57 y = sqrtl (x); |
12760 | 58 ASSERT (y >= 0.7745966692L && y <= 0.7745966693L); |
59 | |
16697
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
60 /* Another particular value. */ |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
61 { |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
62 long double z; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
63 long double err; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
64 |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
65 x = 8.1974099812331540680810141969554806865L; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
66 y = sqrtl (x); |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
67 z = y * y - x; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
68 err = my_ldexpl (z, LDBL_MANT_DIG); |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
69 if (err < 0) |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
70 err = - err; |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
71 ASSERT (err <= 100.0L); |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
72 } |
6b65a767165c
sqrtl: Bypass broken implementation in OpenBSD 5.1/SPARC.
Bruno Haible <bruno@clisp.org>
parents:
16570
diff
changeset
|
73 |
16570 | 74 test_function (); |
75 | |
12760 | 76 return 0; |
77 } |