2
* fputest.c -- $Id: fputest.c,v 1.1 2003/03/08 15:26:48 travo Exp $
3
* test for SIGFPE delivery
5
* Copyright (c) 1999. See accompanying LEGAL file for details.
12
extern void u_fpu_setup(int when);
13
void u_fpu_setup(int when) {}
21
static jmp_buf u_jmp_target;
23
extern void u_sigfpe(int sig);
24
extern double reciprocal(double x);
25
extern double quotient(double x, double y);
26
extern double powpow(double x, int n);
27
extern int decrement(int *ip);
28
static int always_true = 0;
31
main(int argc, char *argv[])
34
double zero = (double)(argc>1000);
35
double huge = (argc>1000)? 2.0 : 1.e20;
36
always_true = !(argc>1000);
39
if (setjmp(u_jmp_target)) u_fpu_setup(0);
41
/* signal *ought* to be enough to get SIGFPE delivered
42
* -- but it never is -- see README.fpu */
43
signal(SIGFPE, &u_sigfpe);
45
/* need to make sure that loop index i actually decrements
46
* despite interrupt */
47
while (decrement(&i)) {
48
printf("SIGFPE handling failed on pass %d, 1./0. = %g\n", 5-i,
54
if (setjmp(u_jmp_target)) u_fpu_setup(0);
55
while (decrement(&i)) {
56
printf("SIGFPE handling failed on pass %d, 0./0. = %g\n", 5-i,
57
quotient(zero, zero));
62
if (setjmp(u_jmp_target)) u_fpu_setup(0);
63
while (decrement(&i)) {
64
printf("SIGFPE handling failed on pass %d, 10.^20480 = %g\n", 5-i,
69
if (setjmp(u_jmp_target)) {
70
puts("SIGFPE improperly generated on underflow");
73
double x = powpow(1./huge, 10);
75
printf("SIGFPE handling works, but 10.^-20480 = %g\n", x);
77
puts("SIGFPE handling works properly");
90
signal(SIGFPE, &u_sigfpe);
91
longjmp(u_jmp_target, 1);
93
puts("u_sigfpe called, but with bad parameter");
102
if (always_true) i--;
115
quotient(double x, double y)
121
powpow(double x, int n)