#include <math.h>
#include <signal.h>
#include <unistd.h>
void
sigfpe(int signum)
{
_exit(1);
}
int
main(int argc, char *argv[])
{
int opt;
double d, two;
int i;
char method = 'a';
while ((opt = getopt(argc, argv, "amnp")) != -1)
method = (char)opt;
signal(SIGFPE, sigfpe);
switch (method) {
case 'a':
d = 1.0;
for (i = 2000; i != 0; i--) {
d = d + d;
}
if (!isinf(d) || copysign(1.0, d) < 0.0)
return (1);
break;
case 'm':
d = 1.0;
two = 2.0;
for (i = 2000; i != 0; i--) {
d = d * two;
}
if (!isinf(d) || copysign(1.0, d) < 0.0)
return (1);
break;
case 'n':
d = -1.0;
for (i = 2000; i != 0; i--) {
d = d + d;
}
if (!isinf(d) || copysign(1.0, d) > 0.0)
return (1);
break;
case 'p':
d = -1.0;
two = 2.0;
for (i = 2000; i != 0; i--) {
d = d * two;
}
if (!isinf(d) || copysign(1.0, d) > 0.0)
return (1);
break;
}
return (0);
}