blob: b633c55f8a37fd0607c9cfcc2e7af4cebe3f7579 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/* Copyright (C) 2003 Free Software Foundation.
Verify that built-in math function constant folding doesn't break
anything and produces the expected results.
Written by Roger Sayle, 8th June 2003. */
/* { dg-do link } */
/* { dg-options "-O2 -ffast-math" } */
/* Solaris doesn't have the entire C99 runtime. */
#if !defined(sun)
#define HAVE_C99_RUNTIME
#endif
extern void link_error(void);
void test1(double x)
{
if (cos(x) != cos(-x))
link_error ();
if (sin(x)/cos(x) != tan(x))
link_error ();
if (cos(x)/sin(x) != 1.0/tan(x))
link_error ();
if (tan(x)*cos(x) != sin(x))
link_error ();
if (cos(x)*tan(x) != sin(x))
link_error ();
}
void test2(double x, double y)
{
if (-tan(x-y) != tan(y-x))
link_error ();
if (-sin(x-y) != sin(y-x))
link_error ();
}
void test1f(float x)
{
if (cosf(x) != cosf(-x))
link_error ();
#ifdef HAVE_C99_RUNTIME
if (sinf(x)/cosf(x) != tanf(x))
link_error ();
if (cosf(x)/sinf(x) != 1.0f/tanf(x))
link_error ();
if (tanf(x)*cosf(x) != sinf(x))
link_error ();
if (cosf(x)*tanf(x) != sinf(x))
link_error ();
#endif
}
void test2f(float x, float y)
{
if (-tanf(x-y) != tanf(y-x))
link_error ();
if (-sinf(x-y) != sinf(y-x))
link_error ();
}
void test1l(long double x)
{
if (cosl(x) != cosl(-x))
link_error ();
#ifdef HAVE_C99_RUNTIME
if (sinl(x)/cosl(x) != tanl(x))
link_error ();
if (cosl(x)/sinl(x) != 1.0l/tanl(x))
link_error ();
if (tanl(x)*cosl(x) != sinl(x))
link_error ();
if (cosl(x)*tanl(x) != sinl(x))
link_error ();
#endif
}
void test2l(long double x, long double y)
{
if (-tanl(x-y) != tanl(y-x))
link_error ();
if (-sinl(x-y) != sinl(y-x))
link_error ();
}
int main()
{
test1 (1.0);
test2 (1.0, 2.0);
test1f (1.0f);
test2f (1.0f, 2.0f);
test1l (1.0l);
test2l (1.0l, 2.0l);
return 0;
}
|