xref: /openbsd-src/gnu/usr.bin/perl/cpan/Math-BigInt/t/mbimbf.t (revision 3d61058aa5c692477b6d18acfbbdb653a9930ff9)
1eac174f2Safresh1# -*- mode: perl; -*-
2b8851fccSafresh1
3b8851fccSafresh1# test rounding, accuracy, precision and fallback, round_mode and mixing
4b8851fccSafresh1# of classes
5b8851fccSafresh1
6b8851fccSafresh1use strict;
7b8851fccSafresh1use warnings;
8b8851fccSafresh1
99f11ffb7Safresh1use Test::More tests => 712             # tests in require'd file
10*3d61058aSafresh1                        + 52;           # tests in this file
11b8851fccSafresh1
129f11ffb7Safresh1use Math::BigInt only => 'Calc';
13b8851fccSafresh1use Math::BigFloat;
14b8851fccSafresh1
15b8851fccSafresh1our $mbi = 'Math::BigInt';
16b8851fccSafresh1our $mbf = 'Math::BigFloat';
17b8851fccSafresh1
18b46d8ef2Safresh1require './t/mbimbf.inc';
19b8851fccSafresh1
20b8851fccSafresh1# some tests that won't work with subclasses, since the things are only
21b8851fccSafresh1# guaranteed in the Math::Big(Int|Float) (unless subclass chooses to support
22b8851fccSafresh1# this)
23b8851fccSafresh1
24b8851fccSafresh1Math::BigInt->round_mode("even");       # reset for tests
25b8851fccSafresh1Math::BigFloat->round_mode("even");     # reset for tests
26b8851fccSafresh1
27b8851fccSafresh1is($Math::BigInt::rnd_mode,   "even", '$Math::BigInt::rnd_mode = "even"');
28b8851fccSafresh1is($Math::BigFloat::rnd_mode, "even", '$Math::BigFloat::rnd_mode = "even"');
29b8851fccSafresh1
30b8851fccSafresh1my $x = eval '$mbi->round_mode("huhmbi");';
31b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbi' at/,
32b8851fccSafresh1     '$mbi->round_mode("huhmbi")');
33b8851fccSafresh1
34b8851fccSafresh1$x = eval '$mbf->round_mode("huhmbf");';
35b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbf' at/,
36b8851fccSafresh1     '$mbf->round_mode("huhmbf")');
37b8851fccSafresh1
38b8851fccSafresh1# old way (now with test for validity)
39b8851fccSafresh1$x = eval '$Math::BigInt::rnd_mode = "huhmbi";';
40b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbi' at/,
41b8851fccSafresh1     '$Math::BigInt::rnd_mode = "huhmbi"');
42b8851fccSafresh1$x = eval '$Math::BigFloat::rnd_mode = "huhmbf";';
43b8851fccSafresh1like($@, qr/^Unknown round mode 'huhmbf' at/,
44b8851fccSafresh1     '$Math::BigFloat::rnd_mode = "huhmbf"');
45b8851fccSafresh1
46b8851fccSafresh1# see if accessor also changes old variable
47b8851fccSafresh1$mbi->round_mode('odd');
48b8851fccSafresh1is($Math::BigInt::rnd_mode, 'odd', '$Math::BigInt::rnd_mode = "odd"');
49b8851fccSafresh1
50b8851fccSafresh1$mbf->round_mode('odd');
51b8851fccSafresh1is($Math::BigInt::rnd_mode, 'odd', '$Math::BigInt::rnd_mode = "odd"');
52b8851fccSafresh1
53b8851fccSafresh1foreach my $class (qw/Math::BigInt Math::BigFloat/) {
54b8851fccSafresh1    is($class->accuracy(5),  5,     "set A ...");
55b8851fccSafresh1    is($class->precision(),  undef, "... and now P must be cleared");
56b8851fccSafresh1    is($class->precision(5), 5,     "set P ...");
57b8851fccSafresh1    is($class->accuracy(),   undef, "... and now A must be cleared");
58b8851fccSafresh1}
59b8851fccSafresh1
60b8851fccSafresh1foreach my $class (qw/Math::BigInt Math::BigFloat/)  {
61*3d61058aSafresh1    my $x;
62b8851fccSafresh1
63*3d61058aSafresh1    # Accuracy
64b8851fccSafresh1
65*3d61058aSafresh1    # set and check the class accuracy
66*3d61058aSafresh1    $class->accuracy(1);
67*3d61058aSafresh1    is($class->accuracy(), 1, "$class has A of 1");
68b8851fccSafresh1
69*3d61058aSafresh1    # a new instance gets the class accuracy
70*3d61058aSafresh1    $x = $class->new(123);
71*3d61058aSafresh1    is($x->accuracy(), 1, '$x has A of 1');
72b8851fccSafresh1
73*3d61058aSafresh1    # set and check the instance accuracy
74*3d61058aSafresh1    $x->accuracy(2);
75*3d61058aSafresh1    is($x->accuracy(), 2, '$x has A of 2');
76b8851fccSafresh1
77*3d61058aSafresh1    # change the class accuracy
78*3d61058aSafresh1    $class->accuracy(3);
79*3d61058aSafresh1    is($class->accuracy(), 3, "$class has A of 3");
80*3d61058aSafresh1
81*3d61058aSafresh1    # verify that the instance accuracy hasn't changed
82*3d61058aSafresh1    is($x->accuracy(), 2, '$x still has A of 2');
83*3d61058aSafresh1
84*3d61058aSafresh1    # change the instance accuracy
85*3d61058aSafresh1    $x->accuracy(undef);
86*3d61058aSafresh1    is($x->accuracy(), undef, '$x now has A of undef');
87*3d61058aSafresh1
88*3d61058aSafresh1    # check the class accuracy
89*3d61058aSafresh1    is($class->accuracy(), 3, "$class still has A of 3");
90*3d61058aSafresh1
91*3d61058aSafresh1    # change the class accuracy again
92b8851fccSafresh1    $class->accuracy(undef);
93*3d61058aSafresh1    is($class->accuracy(), undef, "$class now has A of undef");
94*3d61058aSafresh1
95*3d61058aSafresh1    # Precision
96*3d61058aSafresh1
97*3d61058aSafresh1    # set and check the class precision
98*3d61058aSafresh1    $class->precision(1);
99*3d61058aSafresh1    is($class->precision(), 1, "$class has A of 1");
100*3d61058aSafresh1
101*3d61058aSafresh1    # a new instance gets the class precision
102*3d61058aSafresh1    $x = $class->new(123);
103*3d61058aSafresh1    is($x->precision(), 1, '$x has A of 1');
104*3d61058aSafresh1
105*3d61058aSafresh1    # set and check the instance precision
106*3d61058aSafresh1    $x->precision(2);
107*3d61058aSafresh1    is($x->precision(), 2, '$x has A of 2');
108*3d61058aSafresh1
109*3d61058aSafresh1    # change the class precision
110*3d61058aSafresh1    $class->precision(3);
111*3d61058aSafresh1    is($class->precision(), 3, "$class has A of 3");
112*3d61058aSafresh1
113*3d61058aSafresh1    # verify that the instance precision hasn't changed
114*3d61058aSafresh1    is($x->precision(), 2, '$x still has A of 2');
115*3d61058aSafresh1
116*3d61058aSafresh1    # change the instance precision
117*3d61058aSafresh1    $x->precision(undef);
118*3d61058aSafresh1    is($x->precision(), undef, '$x now has A of undef');
119*3d61058aSafresh1
120*3d61058aSafresh1    # check the class precision
121*3d61058aSafresh1    is($class->precision(), 3, "$class still has A of 3");
122*3d61058aSafresh1
123*3d61058aSafresh1    # change the class precision again
124b8851fccSafresh1    $class->precision(undef);
125*3d61058aSafresh1    is($class->precision(), undef, "$class now has A of undef");
126b8851fccSafresh1}
127b8851fccSafresh1
128b8851fccSafresh1# bug with blog(Math::BigFloat, Math::BigInt)
129b8851fccSafresh1$x = Math::BigFloat->new(100);
130b8851fccSafresh1$x = $x->blog(Math::BigInt->new(10));
131b8851fccSafresh1
132b8851fccSafresh1is($x, 2, 'bug with blog(Math::BigFloat, Math::BigInt)');
133b8851fccSafresh1
134b8851fccSafresh1# bug until v1.88 for sqrt() with enough digits
135b8851fccSafresh1for my $i (80, 88, 100) {
136b8851fccSafresh1    $x = Math::BigFloat->new("1." . ("0" x $i) . "1");
137b8851fccSafresh1    $x = $x->bsqrt;
138b8851fccSafresh1    is($x, 1, '$x->bsqrt() with many digits');
139b8851fccSafresh1}
140