summaryrefslogtreecommitdiff
path: root/ext/POSIX/t/math.t
blob: e0f57050161297a239613a930258ce71be049883 (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
119
#!perl -w

use strict;

use POSIX;
use Test::More;

use Config;

# These tests are mainly to make sure that these arithmetic functions
# exist and are accessible.  They are not meant to be an exhaustive
# test for the interface.

sub between {
    my ($low, $have, $high, $desc) = @_;
    local $Test::Builder::Level = $Test::Builder::Level + 1;

    cmp_ok($have, '>=', $low, $desc);
    cmp_ok($have, '<=', $high, $desc);
}

is(acos(1), 0, "Basic acos(1) test");
between(3.14, acos(-1), 3.15, 'acos(-1)');
between(1.57, acos(0), 1.58, 'acos(0)');
is(asin(0), 0, "Basic asin(0) test");
cmp_ok(asin(1), '>', 1.57, "Basic asin(1) test");
cmp_ok(asin(-1), '<', -1.57, "Basic asin(-1) test");
cmp_ok(asin(1), '==', -asin(-1), 'asin(1) == -asin(-1)');
is(atan(0), 0, "Basic atan(0) test");
between(0.785, atan(1), 0.786, 'atan(1)');
between(-0.786, atan(-1), -0.785, 'atan(-1)');
cmp_ok(atan(1), '==', -atan(-1), 'atan(1) == -atan(-1)');
is(cosh(0), 1, "Basic cosh(0) test");  
between(1.54, cosh(1), 1.55, 'cosh(1)');
between(1.54, cosh(-1), 1.55, 'cosh(-1)');
is(cosh(1), cosh(-1), 'cosh(1) == cosh(-1)');
is(floor(1.23441242), 1, "Basic floor(1.23441242) test");
is(floor(-1.23441242), -2, "Basic floor(-1.23441242) test");
is(fmod(3.5, 2.0), 1.5, "Basic fmod(3.5, 2.0) test");
is(join(" ", frexp(1)), "0.5 1",  "Basic frexp(1) test");
is(ldexp(0,1), 0, "Basic ldexp(0,1) test");
is(log10(1), 0, "Basic log10(1) test"); 
is(log10(10), 1, "Basic log10(10) test");
is(join(" ", modf(1.76)), "0.76 1", "Basic modf(1.76) test");
is(sinh(0), 0, "Basic sinh(0) test"); 
between(1.17, sinh(1), 1.18, 'sinh(1)');
between(-1.18, sinh(-1), -1.17, 'sinh(-1)');
is(tan(0), 0, "Basic tan(0) test");
between(1.55, tan(1), 1.56, 'tan(1)');
between(1.55, tan(1), 1.56, 'tan(-1)');
cmp_ok(tan(1), '==', -tan(-1), 'tan(1) == -tan(-1)');
is(tanh(0), 0, "Basic tanh(0) test"); 
between(0.76, tanh(1), 0.77, 'tanh(1)');
between(-0.77, tanh(-1), -0.76, 'tanh(-1)');
cmp_ok(tanh(1), '==', -tanh(-1), 'tanh(1) == -tanh(-1)');

SKIP: {
    unless ($Config{d_acosh}) {
        skip "no acosh, suspecting no C99 math", 28;
    }
    if ($^O =~ /Win32|VMS/) {
        skip "running in $^O, C99 math support uneven", 28;
    }
    cmp_ok(abs(M_PI - 3.14159265358979), '<', 1e9, "M_PI");
    cmp_ok(abs(asinh(1) - 0.881373587019543), '<', 1e9, "asinh");
    cmp_ok(abs(cbrt(8) - 2), '<', 1e9, "cbrt");
    is(copysign(3.14, -2), -3.14, "copysign");
    cmp_ok(abs(expm1(2) - 6.38905609893065), '<', 1e9, "expm1");
  SKIP: {
      unless ($Config{d_fpclassify}) {
          skip "no fpclassify", 4;
      }
      is(fpclassify(1), FP_NORMAL, "fpclassify 1");
      is(fpclassify(0), FP_ZERO, "fpclassify 0");
      is(fpclassify(INFINITY), FP_INFINITE, "fpclassify INFINITY");
      is(fpclassify(NAN), FP_NAN, "fpclassify NAN");
    }
  SKIP: {
      unless ($Config{d_isfinite}) {
          skip "no isfinite", 1;
      }
      ok(isfinite(1), "isfinite");
    }
  SKIP: {
      unless ($Config{d_isinf}) {
          skip "no isinf", 1;
      }
      ok(isinf(INFINITY), "isinf");
    }
  SKIP: {
      unless ($Config{d_isnan}) {
          skip "no isnan", 1;
      }
      ok(isnan(NAN), "isnan");
    }
    cmp_ok(abs(log1p(2) - 1.09861228866811), '<', 1e9, "log1p");
    cmp_ok(abs(log2(8) - 3), '<', 1e9, "log2");
  SKIP: {
      unless ($Config{d_signbit}) {
          skip "no signbit", 2;
      }
      is(signbit(2), 0, "signbit 2"); # zero
      ok(signbit(-2), "signbit -2"); # non-zero
    }
    is(round(2.25), 2, "round 2.25");
    is(round(-2.25), -2, "round -2.25");
    is(round(2.5), 3, "round 2.5");
    is(round(-2.5), -3, "round -2.5");
    is(round(2.75), 3, "round 2.75");
    is(round(-2.75), -3, "round 2.75");
    is(trunc(2.25), 2, "trunc 2.25");
    is(trunc(-2.25), -2, "trunc -2.25");
    is(trunc(2.5), 2, "trunc 2.5");
    is(trunc(-2.5), -2, "trunc -2.5");
    is(trunc(2.75), 2, "trunc 2.75");
    is(trunc(-2.75), -2, "trunc -2.75");
}

done_testing();