| 12
 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
 
 | use strict;
use warnings;
use Math::MPFR qw(:mpfr);
use Test::More;
  for my $m(1..25) {
    cmp_ok(subnormalize_float16("${m}e-46" + 0), '==', subnormalize_float16(Math::MPFR->new("${m}e-46" + 0) ), "'${m}e-46'subnormalizes ok");
    cmp_ok(subnormalize_float16("-${m}e-46" + 0), '==', subnormalize_float16(Math::MPFR->new("-${m}e-46" + 0) ), "'-${m}e-46'subnormalizes ok");
  }
{
  my $check = Rmpfr_init2(24);
  my $s1 = '3.40282347e38';
  my $rop1 = subnormalize_float32($s1);
  Rmpfr_strtofr($check, $s1, 0, MPFR_RNDN);
  cmp_ok(Rmpfr_get_prec($rop1), '==', 24, "ROP1 has precision of 24");
  cmp_ok(Rmpfr_inf_p($rop1), '==', 0, "ROP1 is NOT Inf");
  cmp_ok($rop1, '==', $check, "ROP1 is set to '3.40282347e38'");
  Rmpfr_nextabove($check);
  cmp_ok("$check", 'eq', '3.40282367e38', "nextabove is '3.40282367e38'");
  $s1 = '-3.40282347e38';
  my $rop2 = subnormalize_float32($s1);
  Rmpfr_strtofr($check, $s1, 0, MPFR_RNDN);
  cmp_ok(Rmpfr_get_prec($rop2), '==', 24, "ROP2 has precision of 24");
  cmp_ok(Rmpfr_inf_p($rop2), '==', 0, "ROP2 is NOT Inf");
  cmp_ok($rop2, '==', $check, "ROP2 is set to '-3.40282347e38'");
  Rmpfr_nextbelow($check);
  cmp_ok("$check", 'eq', '-3.40282367e38', "nextbelow is '-3.40282367e38'");
  $s1 = '3.40282367e38';
  my $rop3 = subnormalize_float32($s1);
  Rmpfr_strtofr($check, $s1, 0, MPFR_RNDN);
  cmp_ok("$check", 'eq', '3.40282367e38', "CHECK has value of '3.40282367e38'");
  cmp_ok(Rmpfr_get_prec($rop3), '==', 24, "ROP3 has precision of 24");
  cmp_ok(Rmpfr_inf_p($rop3), '!=', 0, "ROP3 is Inf");
  cmp_ok($rop3, '>', 0, "ROP3 is +Inf");
  $s1 = '-3.40282367e38';
  my $rop4 = subnormalize_float32($s1);
  Rmpfr_strtofr($check, $s1, 0, MPFR_RNDN);
  cmp_ok("$check", 'eq', '-3.40282367e38', "CHECK has value of '-3.40282367e38'");
  cmp_ok(Rmpfr_get_prec($rop4), '==', 24, "ROP4 has precision of 24");
  cmp_ok(Rmpfr_inf_p($rop4), '!=', 0, "ROP4 is Inf");
  cmp_ok($rop4, '<', 0, "ROP4 is -Inf");
}
my $op = sqrt(Math::MPFR->new(2));
my $nv = Rmpfr_get_flt($op, MPFR_RNDN);
cmp_ok($op, '!=', $nv, "values no longer match");
my $op32 = Rmpfr_init2(24); # _Float32 has 24 bits of precision.
Rmpfr_set_ui($op32, 2, MPFR_RNDN);
Rmpfr_sqrt($op32, $op32, MPFR_RNDN);
cmp_ok($nv, '==', $op32, "values match");
cmp_ok(unpack_float32($nv, MPFR_RNDN), 'eq', '3FB504F3', 'hex unpacking of sqrt(2) is as expected');
my $inex = Rmpfr_set_flt($op, $nv, MPFR_RNDN);
cmp_ok($inex, '==', 0, 'value was set exactly');
cmp_ok($op, '==', $op32, 'values still match');
eval { require Math::Float32; };
unless($@) {
  my $bf_1 = sqrt(Math::Float32->new(2));
  my $bf_2 = Math::Float32->new();
  my $mpfr = Rmpfr_init2(24);
  Rmpfr_set_FLT($mpfr, $bf_1, MPFR_RNDN);
  Rmpfr_get_FLT($bf_2, $mpfr, MPFR_RNDN);
  cmp_ok(Math::Float32::unpack_flt_hex($bf_2), 'eq', '3FB504F3', 'Rmpfr_set_FLT and Rmpfr_get_FLT pass round trip');
}
done_testing();
 |