2
multi method ACCEPTS($other) {
9
multi method ACCEPTS(Complex $other) {
11
$other.re eq 'NaN' || $other.im eq 'NaN';
13
$other.im == 0 && $other.re == self;
16
multi method Complex() {
20
our Num multi method exp() {
28
our Num multi method acos($base = 'radians') {
34
$r!from-radians($base)
37
our Num multi method acosh($base = 'radians') {
47
$r!from-radians($base)
50
our Num multi method acosec($base = 'radians') {
57
$r!from-radians($base)
60
our Num multi method acosech($base = 'radians') {
61
# MUST: This is certainly wrong -- if nothing else,
62
# asinh also calls from-radians on its result.
63
# (Except it seems to be passing tests?)
64
asinh(1/+self)!from-radians($base)
67
our Num multi method acotan($base = 'radians') {
74
$r!from-radians($base)
77
our Num multi method acotanh($base = 'radians') {
87
$r!from-radians($base)
90
our Num multi method asec($base = 'radians') {
96
$r!from-radians($base)
99
our Num multi method asech($base = 'radians') {
111
$r!from-radians($base)
114
our Num multi method asin($base = 'radians') {
120
$r!from-radians($base)
123
our Num multi method asinh($base = 'radians') {
133
$r!from-radians($base)
136
our Num multi method atan($base = 'radians') {
142
$r!from-radians($base)
145
our Num multi method atan2(Num $x = 1, $base = 'radians') {
153
$r!from-radians($base)
156
our Num multi method atanh($base = 'radians') {
166
$r!from-radians($base)
169
our Num multi method cos($base = 'radians') {
170
my $x = self!to-radians($base);
179
our Num multi method cosh($base = 'radians') {
180
my $x = self!to-radians($base);
189
our Num multi method cosec($base = 'radians') {
190
my $x = self!to-radians($base);
200
our Num multi method cosech($base = 'radians') {
201
my $x = self!to-radians($base);
211
our Num multi method cotan($base = 'radians') {
212
my $x = self!to-radians($base);
222
our Num multi method cotanh($base = 'radians') {
223
my $x = self!to-radians($base);
241
multi method log($base) {
253
our Str multi method perl() {
257
sub _modf($num) { my $q = $num.Int; $num - $q, $q; }
259
multi method Rat($epsilon = 1.0e-6) {
261
my $signum = $num < 0 ?? -1 !! 1;
262
$num = -$num if $signum == -1;
264
# Find convergents of the continued fraction.
266
my ($r, $q) = _modf($num);
270
while $r != 0 && abs($num - ($b/$d)) > $epsilon {
271
($r, $q) = _modf(1/$r);
273
($a, $b) = ($b, $q*$b + $a);
274
($c, $d) = ($d, $q*$d + $c);
277
# Note that this result has less error than any Rational with a
278
# smaller denominator but it is not (necessarily) the Rational
279
# with the smallest denominator that has less than $epsilon error.
280
# However, to find that Rational would take more processing.
282
Rat.new($signum * $b, $d);
285
our Num multi method sec($base = 'radians') {
286
my $x = self!to-radians($base);
295
our Num multi method sech($base = 'radians') {
296
my $x = self!to-radians($base);
305
our Num multi method sin($base = 'radians') {
306
my $x = self!to-radians($base);
315
our Num multi method sinh($base = 'radians') {
316
my $x = self!to-radians($base);
326
self ~~ NaN ?? NaN !! self <=> 0;
329
multi method sqrt() {
337
our Str multi method Str() {
341
our Num multi method Num() {
345
our Num multi method tan($base = 'radians') {
346
my $x = self!to-radians($base);
355
our Num multi method tanh($base = 'radians') {
356
my $x = self!to-radians($base);
365
our Complex multi method unpolar(Num $angle) is export {
366
Complex.new(self * $angle.cos("radians"), self * $angle.sin("radians"));