The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Math::MPFR qw(:mpfr);
use Config;

print "1..10\n";

Rmpfr_set_default_prec(120);

my $fr1 = Rmpfr_init();
my $fr2 = Rmpfr_init();
my ($ret1, $ret2);

my $inf = 999**(999**999);
my $nan = $inf / $inf;
my $ninf = $inf * -1;

$ret1 = Rmpfr_set_NV($fr1, sqrt(3.0), MPFR_RNDN);

if(Math::MPFR::_has_longdouble() && !Math::MPFR::_nv_is_float128()) {
  $ret2 = Rmpfr_set_ld($fr2, sqrt(3.0), MPFR_RNDN);
}
elsif(Math::MPFR::_can_pass_float128()) {
  $ret2 = Rmpfr_set_float128($fr2, sqrt(3.0), MPFR_RNDN);
}
elsif(Math::MPFR::_nv_is_float128()) {
  $ret2 = Rmpfr_set_NV($fr2, sqrt(3.0), MPFR_RNDN); # tests 1 & 2 are bound to succeed
}
else {
  $ret2 = Rmpfr_set_d($fr2, sqrt(3.0), MPFR_RNDN);
}

if($fr1 == $fr2) {print "ok 1\n"}
else {
  warn "\n\$fr1: $fr1\n\$fr2: $fr2\n";
  print "not ok 1\n";
}

if($ret1 == $ret2) {print "ok 2\n"}
else {
  warn "\n\$ret1: $ret1\n\$ret2: $ret2\n";
  print "not ok 2\n";
}

if($fr1 == sqrt(3.0) && $fr2 == sqrt(3.0)) {print "ok 3\n"}
else {
  warn "\n$fr1: $fr1\n\$fr2: $fr2\nsqrt(3.0): ", sqrt(3.0), "\n";
  print "not ok 3\n";
}

Rmpfr_set_NV($fr1, $nan, MPFR_RNDN);

if($fr1 != $fr1) {print "ok 4\n"}
else {
  warn "\n Expected NaN, got $fr1\n";
  print "not ok 4\n";
}

Rmpfr_set_NV($fr1, $inf, MPFR_RNDN);

if(Rmpfr_inf_p($fr1) && $fr1 > 0) {print "ok 5\n"}
else {
  warn "\n Expected Inf, got $fr1\n";
  print "not ok 5\n";
}

Rmpfr_set_NV($fr1, $ninf, MPFR_RNDN);

if(Rmpfr_inf_p($fr1) && $fr1 < 0) {print "ok 6\n"}
else {
  warn "\n Expected -Inf, got $fr1\n";
  print "not ok 6\n";
}

if($Config{nvtype} eq '__float128') {
  my $nv_max = 1.18973149535723176508575932662800702e4932;
  my $max = Rmpfr_init2(113);
  Rmpfr_set_NV($max, $nv_max, MPFR_RNDN);
  if($max == $nv_max) {print "ok 7\n"}
  else {
    warn "\n\$max: $max\n\$nv_max: $nv_max\n";
    print "not ok 7\n";
  }
  if(!Rmpfr_cmp_NV($max, $nv_max)) {print "ok 8\n"}
  else {
    warn "\nRmpfr_cmp_NV() returned", Rmpfr_cmp_NV($max, $nv_max), "\nExpected 0\n";
    print "not ok 8\n";
  }

  my $nv_small_neg = -2.75423489483742700033038566794997947e-4928;
  my $small_neg = Rmpfr_init2(113);
  Rmpfr_set_NV($small_neg, $nv_small_neg, MPFR_RNDN);
  if($small_neg == $nv_small_neg) {print "ok 9\n"}
  else {
    warn "\n\$small_neg: $small_neg\n\$nv_small_neg: $nv_small_neg\n";
    print "not ok 9\n";
  }
  if(!Rmpfr_cmp_NV($small_neg, $nv_small_neg)) {print "ok 10\n"}
  else {
    warn "\nRmpfr_cmp_NV() returned", Rmpfr_cmp_NV($small_neg, $nv_small_neg), "\nExpected 0\n";
    print "not ok 10\n";
  }
}
else {
  warn "\nSkipping tests 7 to 10 - NV is not __float128\n";
  print "ok 7\nok 8\nok 9\nok 10\n";
}