diff options
Diffstat (limited to 'src/regress/lib/libc/ieeefp/infinity/infinity.c')
-rw-r--r-- | src/regress/lib/libc/ieeefp/infinity/infinity.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/regress/lib/libc/ieeefp/infinity/infinity.c b/src/regress/lib/libc/ieeefp/infinity/infinity.c new file mode 100644 index 0000000000..3b1b71ec90 --- /dev/null +++ b/src/regress/lib/libc/ieeefp/infinity/infinity.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /* $OpenBSD: infinity.c,v 1.2 2004/01/16 19:34:37 miod Exp $ */ | ||
2 | /* | ||
3 | * Written by Miodrag Vallat, 2004 - Public Domain | ||
4 | * Inspired from Perl's t/op/arith test #134 | ||
5 | */ | ||
6 | |||
7 | #include <math.h> | ||
8 | #include <signal.h> | ||
9 | #include <unistd.h> | ||
10 | |||
11 | void | ||
12 | sigfpe(int signum) | ||
13 | { | ||
14 | /* looks like we don't handle fp overflow correctly... */ | ||
15 | _exit(1); | ||
16 | } | ||
17 | |||
18 | int | ||
19 | main(int argc, char *argv[]) | ||
20 | { | ||
21 | int opt; | ||
22 | double d, two; | ||
23 | int i; | ||
24 | char method = 'a'; | ||
25 | |||
26 | while ((opt = getopt(argc, argv, "amnp")) != -1) | ||
27 | method = (char)opt; | ||
28 | |||
29 | signal(SIGFPE, sigfpe); | ||
30 | |||
31 | switch (method) { | ||
32 | case 'a': | ||
33 | /* try to produce +Inf through addition */ | ||
34 | d = 1.0; | ||
35 | for (i = 2000; i != 0; i--) { | ||
36 | d = d + d; | ||
37 | } | ||
38 | /* result should be _positive_ infinity */ | ||
39 | if (!isinf(d) || copysign(1.0, d) < 0.0) | ||
40 | return (1); | ||
41 | break; | ||
42 | case 'm': | ||
43 | /* try to produce +Inf through multiplication */ | ||
44 | d = 1.0; | ||
45 | two = 2.0; | ||
46 | for (i = 2000; i != 0; i--) { | ||
47 | d = d * two; | ||
48 | } | ||
49 | /* result should be _positive_ infinity */ | ||
50 | if (!isinf(d) || copysign(1.0, d) < 0.0) | ||
51 | return (1); | ||
52 | break; | ||
53 | case 'n': | ||
54 | /* try to produce -Inf through subtraction */ | ||
55 | d = -1.0; | ||
56 | for (i = 2000; i != 0; i--) { | ||
57 | d = d + d; | ||
58 | } | ||
59 | /* result should be _negative_ infinity */ | ||
60 | if (!isinf(d) || copysign(1.0, d) > 0.0) | ||
61 | return (1); | ||
62 | break; | ||
63 | case 'p': | ||
64 | /* try to produce -Inf through multiplication */ | ||
65 | d = -1.0; | ||
66 | two = 2.0; | ||
67 | for (i = 2000; i != 0; i--) { | ||
68 | d = d * two; | ||
69 | } | ||
70 | /* result should be _negative_ infinity */ | ||
71 | if (!isinf(d) || copysign(1.0, d) > 0.0) | ||
72 | return (1); | ||
73 | break; | ||
74 | } | ||
75 | |||
76 | return (0); | ||
77 | } | ||