[t/spec] Further optimizations to the trig tests.
[pugs.git] / t / spec / S32-trig / cosech.t
bloba41d63d6c3ffbf9aa9d48ee289becd3288c6358f
1 # WARNING:
2 # This is a generated file and should not be edited directly.
3 # look into generate-tests.pl instead
4 use v6;
5 use Test;
6 plan *;
8 # This class, designed to help simplify the tests, is very much in a transitional
9 # state.  But it works as well as the previous version at the moment.  I'm checking
10 # it in just to clean up my local build (and save a remote copy as I take my
11 # the machine it lives on vacation).  Should have more updates to this over the 
12 # next several days.  --colomon, Sept 3rd 2009.
14 class AngleAndResult
16     has $.angle_in_degrees;
17     has $.result;
19     INIT {
20         our @radians-to-whatever = (1, 180 / pi, 200 / pi, 1 / (2 * pi));
21         our @degrees-to-whatever = ((312689/99532) / 180, 1, 200 / 180, 1 / 360);
22         our @degrees-to-whatever-num = @degrees-to-whatever.map({ .Num });
23     }
25     multi method new(Int $angle_in_degrees is copy, $result is copy) {
26         self.bless(*, :$angle_in_degrees, :$result);
27     }
28     
29     method complex($imaginary_part_in_radians, $base) {
30         my $z_in_radians = $.angle_in_degrees / 180.0 * pi + ($imaginary_part_in_radians)i;
31                 $z_in_radians * pir::get_global__Ps('@radians-to-whatever')[$base];
32     }
33     
34     method num($base) {
35                 $.angle_in_degrees * pir::get_global__Ps('@degrees-to-whatever-num')[$base];
36     }
37     
38     method rat($base) {
39                 $.angle_in_degrees * pir::get_global__Ps('@degrees-to-whatever')[$base];
40     }
41     
42     method int($base) {
43         $.angle_in_degrees;
44     }
47 my @sines = ( 
48     AngleAndResult.new(-360, 0),
49     AngleAndResult.new(135 - 360, 1/2*sqrt(2)),
50     AngleAndResult.new(330 - 360, -0.5),
51     AngleAndResult.new(0, 0),
52     AngleAndResult.new(30, 0.5),
53     AngleAndResult.new(45, 1/2*sqrt(2)),
54     AngleAndResult.new(90, 1),
55     AngleAndResult.new(135, 1/2*sqrt(2)),
56     AngleAndResult.new(180, 0),
57     AngleAndResult.new(225, -1/2*sqrt(2)),
58     AngleAndResult.new(270, -1),
59     AngleAndResult.new(315, -1/2*sqrt(2)),
60     AngleAndResult.new(360, 0),
61     AngleAndResult.new(30 + 360, 0.5),
62     AngleAndResult.new(225 + 360, -1/2*sqrt(2)),
63     AngleAndResult.new(720, 0)
66 my @cosines = @sines.map({ AngleAndResult.new($_.angle_in_degrees - 90, $_.result) });
68 my @sinhes = @sines.grep({ $_.angle_in_degrees < 500 }).map({ AngleAndResult.new($_.angle_in_degrees, 
69                                              (exp($_.num(Radians)) - exp(-$_.num(Radians))) / 2.0)});
71 my @coshes = @sines.grep({ $_.angle_in_degrees < 500 }).map({ AngleAndResult.new($_.angle_in_degrees, 
72                                              (exp($_.num(Radians)) + exp(-$_.num(Radians))) / 2.0)});
74 my @official_bases = (Radians, Degrees, Gradians, Circles);
76 # cosech tests
78 for @sines -> $angle
80         next if abs(sinh($angle.num('radians'))) < 1e-6;        my $desired_result = 1.0 / sinh($angle.num('radians'));
82     # cosech(Num)
83     is_approx(cosech($angle.num(Radians)), $desired_result, 
84               "cosech(Num) - {$angle.num(Radians)} default");
85     for @official_bases -> $base {
86         is_approx(cosech($angle.num($base), $base), $desired_result, 
87                   "cosech(Num) - {$angle.num($base)} $base");
88     }
89     
90     # cosech(:x(Num))
91     is_approx(cosech(:x($angle.num(Radians))), $desired_result, 
92               "cosech(:x(Num)) - {$angle.num(Radians)} default");
93     for @official_bases -> $base {
94         is_approx(cosech(:x($angle.num($base)), :base($base)), $desired_result, 
95                   "cosech(:x(Num)) - {$angle.num($base)} $base");
96     }
98     # Num.cosech tests
99     is_approx($angle.num(Radians).cosech, $desired_result, 
100               "Num.cosech - {$angle.num(Radians)} default");
101     for @official_bases -> $base {
102         is_approx($angle.num($base).cosech($base), $desired_result, 
103                   "Num.cosech - {$angle.num($base)} $base");
104     }
106     # cosech(Rat)
107     is_approx(cosech($angle.rat(Radians)), $desired_result, 
108               "cosech(Rat) - {$angle.rat(Radians)} default");
109     for @official_bases -> $base {
110         is_approx(cosech($angle.rat($base), $base), $desired_result, 
111                   "cosech(Rat) - {$angle.rat($base)} $base");
112     }
114     # cosech(:x(Rat))
115     is_approx(cosech(:x($angle.rat(Radians))), $desired_result, 
116               "cosech(:x(Rat)) - {$angle.rat(Radians)} default");
117     for @official_bases -> $base {
118         is_approx(cosech(:x($angle.rat($base)), :base($base)), $desired_result, 
119                   "cosech(:x(Rat)) - {$angle.rat($base)} $base");
120     }
122     # Rat.cosech tests
123     is_approx($angle.rat(Radians).cosech, $desired_result, 
124               "Rat.cosech - {$angle.rat(Radians)} default");
125     for @official_bases -> $base {
126         is_approx($angle.rat($base).cosech($base), $desired_result, 
127                   "Rat.cosech - {$angle.rat($base)} $base");
128     }
130     # cosech(Int)
131     is_approx(cosech($angle.int(Degrees), Degrees), $desired_result, 
132               "cosech(Int) - {$angle.int(Degrees)} degrees");
133     is_approx($angle.int(Degrees).cosech(Degrees), $desired_result, 
134               "Int.cosech - {$angle.int(Degrees)} degrees");
136     # Complex tests
137     my Complex $zp0 = $angle.complex(0.0, Radians);
138     my Complex $sz0 = $desired_result + 0i;
139     my Complex $zp1 = $angle.complex(1.0, Radians);
140     my Complex $sz1 = { 1.0 / sinh($_) }($zp1);
141     my Complex $zp2 = $angle.complex(2.0, Radians);
142     my Complex $sz2 = { 1.0 / sinh($_) }($zp2);
143     
144     # cosech(Complex) tests
145     is_approx(cosech($zp0), $sz0, "cosech(Complex) - $zp0 default");
146     is_approx(cosech($zp1), $sz1, "cosech(Complex) - $zp1 default");
147     is_approx(cosech($zp2), $sz2, "cosech(Complex) - $zp2 default");
148     
149     for @official_bases -> $base {
150         my Complex $z = $angle.complex(0.0, $base);
151         is_approx(cosech($z, $base), $sz0, "cosech(Complex) - $z $base");
152     
153         $z = $angle.complex(1.0, $base);
154         is_approx(cosech($z, $base), $sz1, "cosech(Complex) - $z $base");
155                         
156         $z = $angle.complex(2.0, $base);
157         is_approx(cosech($z, $base), $sz2, "cosech(Complex) - $z $base");
158     }
159     
160     # Complex.cosech tests
161     is_approx($zp0.cosech, $sz0, "Complex.cosech - $zp0 default");
162     is_approx($zp1.cosech, $sz1, "Complex.cosech - $zp1 default");
163     is_approx($zp2.cosech, $sz2, "Complex.cosech - $zp2 default");
164     
165     for @official_bases -> $base {
166         my Complex $z = $angle.complex(0.0, $base);
167         is_approx($z.cosech($base), $sz0, "Complex.cosech - $z $base");
168     
169         $z = $angle.complex(1.0, $base);
170         is_approx($z.cosech($base), $sz1, "Complex.cosech - $z $base");
171     
172         $z = $angle.complex(2.0, $base);
173         is_approx($z.cosech($base), $sz2, "Complex.cosech - $z $base");
174     }
177 is(cosech(Inf), 0, "cosech(Inf) - default");
178 is(cosech(-Inf), "-0", "cosech(-Inf) - default");
179 for @official_bases -> $base
181     is(cosech(Inf,  $base), 0, "cosech(Inf) - $base");
182     is(cosech(-Inf, $base), "-0", "cosech(-Inf) - $base");
184         
186 # acosech tests
188 for @sines -> $angle
190         next if abs(sinh($angle.num('radians'))) < 1e-6;        my $desired_result = 1.0 / sinh($angle.num('radians'));
192     # acosech(Num) tests
193     is_approx(cosech(acosech($desired_result)), $desired_result, 
194               "acosech(Num) - {$angle.num(Radians)} default");
195     for @official_bases -> $base {
196         is_approx(cosech(acosech($desired_result, $base), $base), $desired_result, 
197                   "acosech(Num) - {$angle.num($base)} $base");
198     }
199     
200     # acosech(:x(Num))
201     is_approx(cosech(acosech(:x($desired_result))), $desired_result, 
202               "acosech(:x(Num)) - {$angle.num(Radians)} default");
203     for @official_bases -> $base {
204         is_approx(cosech(acosech(:x($desired_result), 
205                                                            :base($base)), 
206                                   $base), $desired_result, 
207                   "acosech(:x(Num)) - {$angle.num($base)} $base");
208     }
209     
210     # Num.acosech tests
211     is_approx($desired_result.Num.acosech.cosech, $desired_result, 
212               "Num.acosech - {$angle.num(Radians)} default");
213     for @official_bases -> $base {
214         is_approx($desired_result.Num.acosech($base).cosech($base), $desired_result,
215                   "Num.acosech - {$angle.num($base)} $base");
216     }
217     
218     # acosech(Complex) tests
219     for ($desired_result + 0i, $desired_result + .5i, $desired_result + 2i) -> $z {
220         is_approx(cosech(acosech($z)), $z, 
221                   "acosech(Complex) - {$angle.num(Radians)} default");
222         for @official_bases -> $base {
223             is_approx(cosech(acosech($z, $base), $base), $z, 
224                       "acosech(Complex) - {$angle.num($base)} $base");
225         }
226         is_approx($z.acosech.cosech, $z, 
227                   "Complex.acosech - {$angle.num(Radians)} default");
228         for @official_bases -> $base {
229             is_approx($z.acosech($base).cosech($base), $z, 
230                       "Complex.acosech - {$angle.num($base)} $base");
231         }
232     }
235 for (-2/2, -1/2, 1/2, 2/2) -> $desired_result
237     # acosech(Rat) tests
238     is_approx(cosech(acosech($desired_result)), $desired_result, 
239               "acosech(Rat) - $desired_result default");
240     for @official_bases -> $base {
241         is_approx(cosech(acosech($desired_result, $base), $base), $desired_result, 
242                   "acosech(Rat) - $desired_result $base");
243     }
244     
245     # Rat.acosech tests
246     is_approx($desired_result.acosech.cosech, $desired_result, 
247               "Rat.acosech - $desired_result default");
248     for @official_bases -> $base {
249         is_approx($desired_result.acosech($base).cosech($base), $desired_result,
250                   "Rat.acosech - $desired_result $base");
251     }
252     
253     next unless $desired_result.denominator == 1;
254     
255     # acosech(Int) tests
256     is_approx(cosech(acosech($desired_result.numerator)), $desired_result, 
257               "acosech(Int) - $desired_result default");
258     for @official_bases -> $base {
259         is_approx(cosech(acosech($desired_result.numerator, $base), $base), $desired_result, 
260                   "acosech(Int) - $desired_result $base");
261     }
262     
263     # Int.acosech tests
264     is_approx($desired_result.numerator.acosech.cosech, $desired_result, 
265               "Int.acosech - $desired_result default");
266     for @official_bases -> $base {
267         is_approx($desired_result.numerator.acosech($base).cosech($base), $desired_result,
268                   "Int.acosech - $desired_result $base");
269     }
271         
272 done_testing;
274 # vim: ft=perl6 nomodifiable