use Math::GMPf qw(:mpf);
use warnings;
use strict;
print "1..49\n";
print "# Using gmp version ", Math::GMPf::gmp_v(), "\n";
my @version = split /\./, Math::GMPf::gmp_v();
my $old = 0;
if($version[0] == 4 && $version[1] < 2) {$old = 1}
if($old) {warn "Test 47 should fail - GMP version ", Math::GMPf::gmp_v(), " is old and doesn't support base 62\n";}
my $have_mpz = 0;
my $have_mpq = 0;
eval {require Math::GMPz};
if(!$@) {$have_mpz = 1}
eval {require Math::GMPq};
if(!$@) {$have_mpq = 1}
my $double = 123456.01234544541;
my $ui = 123456789;
my $si = -123456788;
my $str = '21.135@12';
my $p = Rmpf_init2(200);
my $q = Rmpf_init2(Rmpf_get_default_prec);
my $s = Rmpf_init();
my $t = Rmpf_init();
my $z;
my $rat;
if($have_mpz) {$z = Math::GMPz::Rmpz_init_set_str('asdfgkjqqqqqqqqqqq', 36)}
my $r = Rmpf_init_set_str('faaaaaaaaassssssssssssssaaaaaaaaaaaaaah@20', 36);
if($have_mpq) {
$rat = Math::GMPq::Rmpq_init();
Math::GMPq::Rmpq_set_ui($rat, 123, 1);
}
Rmpf_set_default_prec(100);
if(Rmpf_get_default_prec() >= 100) {print "ok 1\n"}
else {print "not ok 1\n"}
if(Rmpf_get_prec($p) >= 200) {print "ok 2\n"}
else {print "not ok 2\n"}
Rmpf_set_prec($p, 300);
if(Rmpf_get_prec($p) >= 300) {print "ok 3\n"}
else {print "not ok 3\n"}
my $prec = Rmpf_get_prec($p);
Rmpf_set_prec_raw($p, $prec + 10);
if(Rmpf_get_prec($p) >= $prec + 10) {print "ok 4\n"}
else {print "not ok 4\n"}
Rmpf_set_prec($p, $prec);
if(Rmpf_get_prec($p) == $prec) {print "ok 5\n"}
else {print "not ok 5\n"}
Rmpf_set_d($p, $double);
Rmpf_set_d($q, $double);
if(!Rmpf_cmp($p, $q)) {print "ok 6\n"}
else {print "not ok 6\n"}
if(!Rmpf_cmp_d($p, $double)) {print "ok 7\n"}
else {print "not ok 7\n"}
Rmpf_set_ui($p, $ui);
if(!Rmpf_cmp_ui($p, $ui)) {print "ok 8\n"}
else {print "not ok 8\n"}
Rmpf_set_si($p, $si);
if(!Rmpf_cmp_si($p, $si)) {print "ok 9\n"}
else {print "not ok 9\n"}
Rmpf_set_str($p, $str, 10);
if(Rmpf_get_str($p, 10, 0) eq '0.21135e14') {print "ok 10\n"}
else {print "not ok 10\n"}
if($have_mpz) {
Rmpf_set_z($p, $z);
if(Rmpf_get_str($p, 36, 0) eq'0.asdfgkjqqqqqqqqqqq@18') {print "ok 11\n"}
else {print "not ok 11\n"}
}
else {
warn "Skipping test 11 - no Math::GMPz\n";
print "ok 11\n";
}
Rmpf_set_d($p, $double);
my $check = Rmpf_get_d($p);
if(abs($check - $double) < 0.0001) {print "ok 12\n"}
else {print "not ok 12\n"}
Rmpf_set_ui($p, $ui);
$check = Rmpf_get_ui($p);
if($check == $ui) {print "ok 13\n"}
else {print "not ok 13\n"}
Rmpf_set_si($p, $si);
$check = Rmpf_get_si($p);
if($check == $si) {print "ok 14\n"}
else {print "not ok 14\n"}
my @vals = Rmpf_get_d_2exp($r);
if($vals[0] < 0.7715663996200 &&
$vals[0] > 0.7715663996199 &&
$vals[1] == 573) {print "ok 15\n"}
else {print "not ok 15\n"}
Rmpf_add($q, $r, $r);
Rmpf_mul_ui($s, $r, 2);
if(!Rmpf_cmp($q, $s)) {print "ok 16\n"}
else {print "not ok 16\n"}
Rmpf_mul_2exp($q, $r, 1);
if(!Rmpf_cmp($q, $s)) {print "ok 17\n"}
else {print "not ok 17\n"}
Rmpf_div_2exp($q, $q, 1);
if(Rmpf_eq($q, $r, 64)) {print "ok 18\n"}
else {print "not ok 18\n"}
Rmpf_add_ui($q, $r, 1023);
Rmpf_sub_ui($q, $q, 1023);
if(!Rmpf_cmp($q, $r)) {print "ok 19\n"}
else {print "not ok 19\n"}
Rmpf_sub($s, $s, $r);
if(Rmpf_eq($s, $r, 64)) {print "ok 20\n"}
else {print "not ok 20\n"}
Rmpf_ui_sub($s, 11237, $r);
Rmpf_sub_ui($q, $r, 11237);
Rmpf_add($s, $s, $q);
if(!Rmpf_cmp_ui($s, 0)) {print "ok 21\n"}
else {print "not ok 21\n"}
Rmpf_neg($s, $r);
if(Rmpf_sgn($r) == 1 && Rmpf_sgn($s) == -1) {print "ok 22\n"}
else {print "not ok 22\n"}
Rmpf_abs($t, $s);
if(!Rmpf_cmp($t, $r)) {print "ok 23\n"}
else {print "not ok 23\n"}
if(Rmpf_get_str($t, 16, 0) eq Rmpf_get_str($r, 16, 0)) {print "ok 24\n"}
else {print "not ok 24\n"}
Rmpf_reldiff($q, $s, $r);
if(Rmpf_cmp_d($q, -1.9999999) <= 0 && Rmpf_cmp_d($q, -2.0000001) >= 0) {print "ok 25\n"}
else {print "not ok 25\n"}
Rmpf_add($s, $r, $s);
if(!Rmpf_cmp_ui($s, 0)) {print "ok 26\n"}
else {print "not ok 26\n"}
Rmpf_set_d($q, $double);
Rmpf_pow_ui($s, $q, 2);
Rmpf_sqrt($s, $s);
if(Rmpf_eq($s, $q, 48)) {print "ok 27\n"}
else {print "not ok27\n"}
Rmpf_ceil($s, $q);
if(Rmpf_integer_p($s)) {print "ok 28\n"}
else {print "not ok 28\n"}
Rmpf_floor($s, $q);
if(Rmpf_integer_p($s)) {print "ok 29\n"}
else {print "not ok 29\n"}
Rmpf_trunc($s, $q);
if(Rmpf_integer_p($s)) {print "ok 30\n"}
else {print "not ok 30\n"}
Rmpf_div($s, $q, $r);
Rmpf_mul($t, $s, $r);
if(Rmpf_eq($t, $q, 48)) {print "ok 31\n"}
else {print "ok 31\n"}
Rmpf_div_ui($s, $q, 1234);
Rmpf_mul_ui($t, $s, 1234);
if(Rmpf_eq($t, $q, 48)) {print "ok 32\n"}
else {print "ok 32\n"}
Rmpf_sqrt_ui($t, 1000000);
if(!Rmpf_cmp_ui($t, 1000)) {print "ok 33\n"}
else {print "not ok 33\n"}
Rmpf_set_si($t, -1);
if(!Rmpf_fits_ulong_p($t)) {print "ok 34\n"}
else {print "not ok 34\n"}
if(Rmpf_fits_slong_p($t)) {print "ok 35\n"}
else {print "not ok 35\n"}
if(!Rmpf_fits_uint_p($t)) {print "ok 36\n"}
else {print "not ok 36\n"}
if(Rmpf_fits_sint_p($t)) {print "ok 37\n"}
else {print "not ok 37\n"}
if(!Rmpf_fits_ushort_p($t)) {print "ok 38\n"}
else {print "not ok 38\n"}
if(Rmpf_fits_sshort_p($t)) {print "ok 39\n"}
else {print "not ok 39\n"}
Rmpf_swap($q, $t);
if(!Rmpf_cmp_d($t, $double) && !Rmpf_cmp_si($q, -1)) {print "ok 40\n"}
else {print "ok 40\n"}
if($have_mpq) {
Rmpf_set_q($q, $rat);
if(Rmpf_integer_p($q)) {print "ok 41\n"}
else {print "not ok 41\n"}
}
else {
Rmpf_set_d($q, 123);
warn "Skipping test 41 - no Math::GMPq\n";
print "ok 41\n";
}
if($have_mpz) {
my $str = '';
for(1..64) {$str .= int(rand(2))}
my $seed = Math::GMPz::Rmpz_init_set_str($str, 2);
my $state = Math::GMPz::rand_init($seed);
my @r = ();
for(1..100) {push @r, Rmpf_init2(75)}
my $ok = 1;
Rmpf_urandomb(@r, $state, 75, scalar(@r));
for(@r) {
if(length(Rmpf_get_str($_, 2, 0)) > 80 || length(Rmpf_get_str($_, 2, 0)) < 40) {$ok = 0}
}
if($ok) {print "ok 42\n"}
else {print "not ok 42\n"}
Math::GMPz::rand_clear($state);
}
else {
warn "Skipping test 42 - no Math::GMPz\n";
print "ok 42\n";
}
my $w0 = Rmpf_init_set_ui(12345670);
my $w1 = Rmpf_init_set_si(-12345670);
Rmpf_add($w0, $w1, $w0);
if(!Rmpf_cmp_ui($w0, 0)) {print "ok 43\n"}
else {print "not ok 43\n"}
my $w2 = Rmpf_init_set_d(123.75);
my $dw2 = Rmpf_get_d($w2);
if(!Rmpf_cmp_d($w2, $dw2)) {print "ok 44\n"}
else {print "not ok 44\n"}
eval {$str = Math::GMPf::gmp_v();};
if($@ || $str =~ /[^0-9\.]/) {print "not ok 45\n"}
else {print "ok 45\n"}
#my $ofh = select(STDERR);
eval {Rmpf_printf("The version is %s. Values are %d %.2Ff %.3Ff\n", $str, 11, $w2, $w0);};
#select($ofh);
if(!$@) { print "not ok 46\n"}
else {print "ok 46\n"}
if(Rmpf_get_str($q, 62, 0) eq '0.1z@2') {print "ok 47\n"}
else {print "not ok 47\n"}
eval {Rmpf_get_str($q, -37, 0);};
if($@ =~ /is not in acceptable range/) {print "ok 48\n"}
else {print "not ok 48\n"}
@vals = Rmpf_get_d_2exp(Math::GMPf->new(0.125));
if($vals[0] == 0.5 && $vals[1] == -2) {print "ok 49\n"}
else {print "not ok 49 @vals\n"}