summaryrefslogtreecommitdiff
path: root/src/regress/lib/libc/ieeefp/infinity/infinity.c
diff options
context:
space:
mode:
authormiod <>2004-01-16 19:34:37 +0000
committermiod <>2004-01-16 19:34:37 +0000
commit1d7384540d665cdb91806c51a5b917ad6e152388 (patch)
tree0ecf047fe559923a042a7b510dfd183368919b9d /src/regress/lib/libc/ieeefp/infinity/infinity.c
parentb4594fd38896c2ffb37c430cb680d9a4a2c6ad0d (diff)
downloadopenbsd-1d7384540d665cdb91806c51a5b917ad6e152388.tar.gz
openbsd-1d7384540d665cdb91806c51a5b917ad6e152388.tar.bz2
openbsd-1d7384540d665cdb91806c51a5b917ad6e152388.zip
Test more ways of producing a positive infinity, and then test negative
infinity as well to prevent entropy leak; the usual suspects still fail all tests.
Diffstat (limited to 'src/regress/lib/libc/ieeefp/infinity/infinity.c')
-rw-r--r--src/regress/lib/libc/ieeefp/infinity/infinity.c59
1 files changed, 52 insertions, 7 deletions
diff --git a/src/regress/lib/libc/ieeefp/infinity/infinity.c b/src/regress/lib/libc/ieeefp/infinity/infinity.c
index 0f60b4762b..3b1b71ec90 100644
--- a/src/regress/lib/libc/ieeefp/infinity/infinity.c
+++ b/src/regress/lib/libc/ieeefp/infinity/infinity.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: infinity.c,v 1.1 2004/01/15 18:53:24 miod Exp $ */ 1/* $OpenBSD: infinity.c,v 1.2 2004/01/16 19:34:37 miod Exp $ */
2/* 2/*
3 * Written by Miodrag Vallat, 2004 - Public Domain 3 * Written by Miodrag Vallat, 2004 - Public Domain
4 * Inspired from Perl's t/op/arith test #134 4 * Inspired from Perl's t/op/arith test #134
@@ -6,6 +6,7 @@
6 6
7#include <math.h> 7#include <math.h>
8#include <signal.h> 8#include <signal.h>
9#include <unistd.h>
9 10
10void 11void
11sigfpe(int signum) 12sigfpe(int signum)
@@ -17,16 +18,60 @@ sigfpe(int signum)
17int 18int
18main(int argc, char *argv[]) 19main(int argc, char *argv[])
19{ 20{
20 double d, u; 21 int opt;
22 double d, two;
21 int i; 23 int i;
24 char method = 'a';
25
26 while ((opt = getopt(argc, argv, "amnp")) != -1)
27 method = (char)opt;
22 28
23 signal(SIGFPE, sigfpe); 29 signal(SIGFPE, sigfpe);
24 30
25 d = 1.0; 31 switch (method) {
26 for (i = 2000; i != 0; i--) { 32 case 'a':
27 d = d * 2.0; 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;
28 } 74 }
29 75
30 /* result should be _positive_ infinity */ 76 return (0);
31 return ((isinf(d) && copysign(1.0, d) > 0.0) ? 0 : 1);
32} 77}