File: new_pow_log_exp.t

package info (click to toggle)
libmath-mpfr-perl 4.45-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,716 kB
  • sloc: perl: 1,508; ansic: 517; makefile: 9
file content (107 lines) | stat: -rwxr-xr-x 4,146 bytes parent folder | download | duplicates (2)
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

# Here we test the new pow() functions that were added in mpfr-4.2.0:
# Rmpfr_powr, Rmpfr_log2p1, Rmpfr_log10p1' Rmpfr_compound_si, Rmpfr_exp2m1,
# Rmpfr_exp10m1, Rmpfr_pown, Rmpfr_pow_uj and Rmpfr_pow_sj.

use strict;
use warnings;
use Config;
use Test::More;
use Math::MPFR qw(:mpfr);

my $has_420 = 0;
$has_420++ if MPFR_VERSION() >= 262656; # mpfr-4.2.0 or later

my $iv_is_longlong = Math::MPFR::_has_longlong();

# my $pi = Math::MPFR->new('3.1415926535897931');

my $rop1 = Math::MPFR->new();
my $rop2 = Math::MPFR->new();
my $op   = Math::MPFR->new('0.999999999');
my $op2  = Math::MPFR->new(7);


if($has_420) {

  my $rop_check = exp($op2 * log($op));
  Rmpfr_powr($rop1, $op, $op2, MPFR_RNDN);
  cmp_ok( abs($rop_check - $rop1), '==', 0, "Rmpfr_powr is in range ($rop1 | $rop_check)" );

  $rop_check = ($op + 1) ** -7;
  Rmpfr_compound_si($rop1, $op, -7, MPFR_RNDN);
  cmp_ok( abs($rop_check - $rop1), '<', 1e-17, "Rmpfr_compound_si is in range ($rop1 | $rop_check)" );

  Rmpfr_log2($rop2, $op + 1, MPFR_RNDN);
  Rmpfr_log2p1 ($rop1, $op, MPFR_RNDN);
  cmp_ok( abs($rop2 - $rop1), '==', 0, "Rmpfr_log2p1 is in range ($rop1 | $rop2)" );

  Rmpfr_log10($rop2, $op + 1, MPFR_RNDN);
  Rmpfr_log10p1 ($rop1, $op, MPFR_RNDN);
  cmp_ok( abs($rop2 - $rop1), '==', 0, "Rmpfr_log10p1 is in range ($rop1 | $rop2)" );

  $rop_check = (2 ** Math::MPFR->new(6)) - 1;
  Rmpfr_exp2m1 ($rop1, Math::MPFR->new(6), MPFR_RNDN);
  cmp_ok( abs($rop_check - $rop1), '==', 0, "Rmpfr_exp2m1 is in range ($rop1 | $rop_check)" );

  $rop_check = (10 ** Math::MPFR->new(5)) - 1;
  Rmpfr_exp10m1 ($rop1, Math::MPFR->new(5), MPFR_RNDN);
  cmp_ok( abs($rop_check - $rop1), '==', 0, "Rmpfr_exp10m1 is in range ($rop1 | $rop_check)" );

  $rop_check = $op ** 7;
  Rmpfr_pow_uj($rop1, $op, 7, MPFR_RNDN);
  cmp_ok($rop_check, '==', $rop1, 'Rmpfr_pow_uj is ok');

  $rop_check = $op ** -7;
  Rmpfr_pow_sj($rop1, $op, -7, MPFR_RNDN);
  cmp_ok($rop_check, '==', $rop1, 'Rmpfr_pow_sj is ok');

  Rmpfr_pown($rop2, $op, -7, MPFR_RNDN);
  cmp_ok($rop2, '==', $rop1, 'Rmpfr_pown is ok');
}
else {

  eval { Rmpfr_powr($rop2, $op, $op, MPFR_RNDN);  };
  like ( $@, qr/^Rmpfr_powr function not implemented until/,   'Rmpfr_powr not implemented'   );

  eval { Rmpfr_pow_uj($rop1, $op, 7, MPFR_RNDN);  };
  like ( $@, qr/^Rmpfr_pow_uj function not implemented until/, 'Rmpfr_pow_uj not implemented' );

  eval { Rmpfr_pow_sj($rop1, $op, -7, MPFR_RNDN); };
  like ( $@, qr/^Rmpfr_pow_sj function not implemented until/, 'Rmpfr_pow_sj not implemented' );

  eval { Rmpfr_pown($rop2, $op, -7, MPFR_RNDN);   };
  like ( $@, qr/^Rmpfr_pown function not implemented until/,   'Rmpfr_pown not implemented'   );

  eval { Rmpfr_compound_si($rop1, $op, 7, MPFR_RNDN);  };
  like ( $@, qr/^Rmpfr_compound_si function not implemented until/, 'Rmpfr_compound_si not implemented' );

  eval { Rmpfr_log2p1($rop1, $op, MPFR_RNDN);   };
  like ( $@, qr/^Rmpfr_log2p1 function not implemented until/,   'Rmpfr_log2p1 not implemented'   );

  eval { Rmpfr_log10p1($rop1, $op, MPFR_RNDN);   };
  like ( $@, qr/^Rmpfr_log10p1 function not implemented until/,   'Rmpfr_log10p1 not implemented' );

  eval { Rmpfr_exp2m1($rop1, $op, MPFR_RNDN);   };
  like ( $@, qr/^Rmpfr_exp2m1 function not implemented until/,   'Rmpfr_exp2m1 not implemented'   );

  eval { Rmpfr_exp10m1($rop1, $op, MPFR_RNDN);   };
  like ( $@, qr/^Rmpfr_exp10m1 function not implemented until/,   'Rmpfr_exp10m1 not implemented' );

}

my $inex1 = Rmpfr_pow_IV($rop1, Math::MPFR->new(2), -11, MPFR_RNDN);
my $inex2 = Rmpfr_pow_si($rop2, Math::MPFR->new(2), -11, MPFR_RNDN);

cmp_ok( $rop1,  '==', $rop2, "Rmpfr_pow_IV and Rmpfr_pow_si calculate same result" );
cmp_ok( $inex1, '==', 0,     "Rmpfr_pow_IV returns 0" );
cmp_ok( $inex2, '==', 0,     "Rmpfr_pow_si returns 0" );

$inex1 = Rmpfr_pow_IV($rop1, Math::MPFR->new(2), 11, MPFR_RNDN);
$inex2 = Rmpfr_pow_ui($rop2, Math::MPFR->new(2), 11, MPFR_RNDN);

cmp_ok( $rop1,  '==', $rop2, "Rmpfr_pow_IV and Rmpfr_pow_ui calculate same result" );
cmp_ok( $inex1, '==', 0,     "Rmpfr_pow_IV returns 0" );
cmp_ok( $inex2, '==', 0,     "Rmpfr_pow_ui returns 0" );

done_testing();