xref: /openbsd-src/gnu/usr.bin/perl/cpan/Math-BigInt/t/bigroot.t (revision eac174f2741a08d8deb8aae59a7f778ef9b5d770)
1*eac174f2Safresh1# -*- mode: perl; -*-
2b8851fccSafresh1
3b8851fccSafresh1# Test broot function (and bsqrt() function, since it is used by broot()).
4b8851fccSafresh1
5b8851fccSafresh1# It is too slow to be simple included in bigfltpm.inc, where it would get
6b8851fccSafresh1# executed 3 times.
7b8851fccSafresh1
8b8851fccSafresh1# But it is better to test the numerical functionality, instead of not testing
9b8851fccSafresh1# it at all.
10b8851fccSafresh1
11b8851fccSafresh1use strict;                     # restrict unsafe constructs
12b8851fccSafresh1use warnings;                   # enable optional warnings
13b8851fccSafresh1
14b46d8ef2Safresh1use Test::More tests => 16;
15b8851fccSafresh1
169f11ffb7Safresh1use Math::BigFloat only => 'Calc';
17b8851fccSafresh1use Math::BigInt;
18b8851fccSafresh1
19b8851fccSafresh1my $mbf = "Math::BigFloat";
20b8851fccSafresh1my $mbi = "Math::BigInt";
21b8851fccSafresh1
22b8851fccSafresh1# 2 ** 240 =
23b8851fccSafresh1# 1766847064778384329583297500742918515827483896875618958121606201292619776
24b8851fccSafresh1
25b46d8ef2Safresh1test_broot('2', '240', 8, undef,
26b46d8ef2Safresh1           '1073741824');
27b46d8ef2Safresh1test_broot('2', '240', 9, undef,
28b46d8ef2Safresh1           '106528681.3099908308759836475139583940127');
29b46d8ef2Safresh1test_broot('2', '120', 9, undef,
30b46d8ef2Safresh1           '10321.27324073880096577298929482324664787');
31b46d8ef2Safresh1test_broot('2', '120', 17, undef,
32b46d8ef2Safresh1           '133.3268493632747279600707813049418888729');
33b8851fccSafresh1
34b8851fccSafresh1test_broot('2', '120', 8, undef,
35b8851fccSafresh1           '32768');
36b8851fccSafresh1test_broot('2', '60', 8, undef,
37b8851fccSafresh1           '181.0193359837561662466161566988413540569');
38b8851fccSafresh1test_broot('2', '60', 9, undef,
39b8851fccSafresh1           '101.5936673259647663841091609134277286651');
40b8851fccSafresh1test_broot('2', '60', 17, undef,
41b8851fccSafresh1           '11.54672461623965153271017217302844672562');
42b8851fccSafresh1
43b8851fccSafresh1sub test_broot {
44b8851fccSafresh1    my ($x, $n, $y, $scale, $expected) = @_;
45b8851fccSafresh1
46b8851fccSafresh1    my $s = $scale || 'undef';
47b8851fccSafresh1    is($mbf->new($x)->bpow($n)->broot($y, $scale), $expected,
48b8851fccSafresh1       "Try: $mbf->new($x)->bpow($n)->broot($y, $s) == $expected");
49b46d8ef2Safresh1
50b46d8ef2Safresh1    # Math::BigInt returns the truncated integer part of the output, so remove
51b46d8ef2Safresh1    # the dot an anything after it before comparing.
52b46d8ef2Safresh1
53b8851fccSafresh1    $expected =~ s/\..*//;
54b8851fccSafresh1    is($mbi->new($x)->bpow($n)->broot($y, $scale), $expected,
55b8851fccSafresh1       "Try: $mbi->new($x)->bpow($n)->broot($y, $s) == $expected");
56b8851fccSafresh1}
57