# Here we check that a (somewhat anomalous) behaviour that can
# arise when strings are involved in overloaded comparisons with
# Math::MPFR objects ('==', '!=', '<', '>', '<=', '>=' and '<=>')
# is as expected.
# Some of these tests require Math::GMPz.
use
strict;
use
warnings;
use
Math::MPFR;
use
Config;
use
Test::More;
my
$have_mpz
= 0;
$have_mpz
++
unless
$@;
if
(
$Config
{ivsize} == 8) {
my
$f
= Math::MPFR->new(2 ** 64);
# 0x1p+63
my
$i
= ~0;
# == 18446744073709551615, 1 less than 2 ** 64
cmp_ok(
$f
,
'>'
,
$i
,
'2**64 > 18446744073709551615 (IV)'
);
# $i is evaluated to its full (64-bit) precision.
cmp_ok(
$f
,
'=='
,
"$i"
,
'2**64 == "18446744073709551615" (PV)'
);
# "$i" is rounded to 53-bit precision.
if
(
$have_mpz
) {
# In order to have the string "$i" evaluated to its full 64-bit precision:
cmp_ok(
$f
,
'>'
, Math::GMPz->new(
"$i"
),
'2**64 > "18446744073709551615" (mpz)'
);
}
}
if
(
$Config
{nvsize} > 8) {
my
$f
= Math::MPFR->new(2 ** 63);
# 9.223372036854775808e18
my
$s
=
sprintf
"%.20e"
, (2 ** 63) + 1;
# 9.223372036854775809e18
cmp_ok(
$f
,
'=='
,
$s
,
'2**63 == (2**63)+1 - RHS is PV'
);
# $s, (POK): treated as PV
if
(
$Config
{ivsize} < 8) {
cmp_ok(
$f
,
'<'
,
$s
+ 0,
'2**63 < (2**63)+1 - RHS is NV'
);
# '$s + 0', (NOK): treated as NV
cmp_ok(
$f
,
'=='
,
$s
,
'2**63 == (2**63)+1 - RHS is again PV'
);
# $s, (now POK and NOK): treated as PV
}
else
{
cmp_ok(
$f
,
'<'
,
$s
+ 0,
'2**63 < (2**63)+1 - RHS is IV'
);
# '$s + 0', (IOK): treated as IV
cmp_ok(
$f
,
'<'
,
$s
,
'2**63 < (2**63)+1 - RHS is still IV'
);
# $s, (now POK and IOK): treated as IV
}
}
my
$f
= Math::MPFR->new(2 ** 70);
# 1180591620717411303424
my
$s
=
'1180591620717411303423'
;
# 1 less than 2 ** 70;
cmp_ok(
$f
,
'=='
,
$s
,
'2**70 == (2**70)-1 - RHS is PV'
);
# Value of $s is rounded to 53-bit precision.
if
(
$have_mpz
) {
# $s is evaluated to its full (70-bit) precision:
cmp_ok(
$f
,
'>'
, Math::GMPz->new(
$s
),
'2**70 > (2**70)-1 - RHS is mpz'
);
}
done_testing();