1# Add various tests here as they come to mind.
2
3use strict;
4use warnings;
5use Math::MPFR qw(:mpfr);
6use Config;
7use Test::More;
8
9if($] < 5.03 && $Config{nvtype} ne '__float128') {
10  plan skip_all => "Perl's string to NV assignment is unreliable\n";
11}
12
13else {
14
15  plan tests => 11;
16
17  my $m = 9.007199254740991e15; # 2 ** 53
18
19  cmp_ok(nvtoa(2 ** 105), '==', 2 ** 105, "nvtoa(2 ** 105) == 2 ** 105");
20  cmp_ok(nvtoa(2 ** 106), '==', 2 ** 106, "nvtoa(2 ** 106) == 2 ** 106");
21
22  cmp_ok(nvtoa($m * (2 ** 53)), '==', $m * (2 ** 53), "nvtoa($m*(2**53)) == $m*(2**53)");
23  cmp_ok(nvtoa($m * (2 ** 54)), '==', $m * (2 ** 54), "nvtoa($m*(2**54)) == $m*(2**54)");
24
25  cmp_ok(nvtoa(2 ** 120), '==', 2 ** 120, "nvtoa(2 ** 120) == 2 ** 120");
26
27  cmp_ok(nvtoa(29 * (2 ** 1001)), '==', 29 * (2 ** 1001), "nvtoa(29 * (2 ** 1001)) == 29 * (2 ** 1001)");
28
29  cmp_ok(nvtoa(1.7976931348623157e+308), '==', 1.7976931348623157e+308, "nvtoa(DBL_MAX) == DBL_MAX");
30
31  cmp_ok(nvtoa(123456789012345.0), '==', 123456789012345.0, "nvtoa(123456789012345.0) == 123456789012345.0");
32
33  cmp_ok(nvtoa(1.0 / 10.0), 'eq', '0.1', "nvtoa(1.0 / 10.0) eq '0.1'");
34
35  if($Config{nvsize} > 8 &&
36     $Config{nvtype} eq 'long double' &&
37     Math::MPFR::_required_ldbl_mant_dig() != 113) {
38
39    cmp_ok(nvtoa(1.4 / 10),  'eq', '0.14',  "nvtoa(1.4 / 10) eq '0.14'" );
40
41    if(Math::MPFR::_required_ldbl_mant_dig() == 2098) {
42      # DoubleDouble
43      cmp_ok(nvtoa(1.4 / 100), 'ne', '0.014', "nvtoa(1.4 / 10) ne '0.014'"); # 0.014000...0013
44    }
45    else {
46      # 64-bit precision NV
47      cmp_ok(nvtoa(1.4 / 100), 'eq', '0.014', "nvtoa(1.4 / 10) eq '0.014'");
48    }
49  }
50  else {
51    cmp_ok(nvtoa(1.4 / 10),  'ne', '0.14',  "nvtoa(1.4 / 10) ne '0.14'" ); # 0.13999...99
52
53    if($Config{nvtype} eq '__float128' || ($Config{nvsize} > 8 && $Config{nvtype} eq 'long double')) {
54      # 113-bit precision NV
55      cmp_ok(nvtoa(1.4 / 100), 'eq', '0.014', "nvtoa(1.4 / 100) eq '0.014'");
56    }
57    else {
58      # 53-bit precision NV
59      cmp_ok(nvtoa(1.4 / 100), 'ne', '0.014', "nvtoa(1.4 / 100) ne '0.014'"); # 0.013999...99
60    }
61  }
62}
63