Commit da58bcba authored by Lucas Kanashiro's avatar Lucas Kanashiro

Imported Upstream version 1.999710

parent 7fb81648
......@@ -1500,6 +1500,15 @@ The changes are now grouped by distribution.
* Required version of Test::More is 0.9301.
2015-11-12 v1.999710 pjacklam
* New method Math::BigFloat -> from_hex() which supports hexadecimal floating
point numbers, e.g., "0x1.999ap-4".
* New test file t/from_hex-mbf.t for testing Math::BigFloat -> from_hex().
* Add 'from_hex' and 'from_bin' to list of methods in the Math::BigInt POD.
Please send us test-reports, your experiences with this and your ideas - we love
to hear about our work!
......
......@@ -50,6 +50,7 @@ t/config.t
t/const_mbf.t
t/constant.t
t/downgrade.t
t/from_hex-mbf.t
t/inf_nan.t
t/isa.t
t/lib_load.t
......
......@@ -40,6 +40,6 @@
}
},
"release_status" : "stable",
"version" : "1.999709",
"version" : "1.999710",
"x_serialization_backend" : "JSON::PP version 2.27300"
}
......@@ -22,5 +22,5 @@ requires:
Math::Complex: '1.39'
Test::More: '0.9301'
perl: '5.006002'
version: '1.999709'
version: '1.999710'
x_serialization_backend: 'CPAN::Meta::YAML version 0.016'
......@@ -16,15 +16,15 @@ Hash: SHA1
SHA1 f6ef98e8f3f6a4f670d569f279ef5a3c05c16d0c BENCHMARK
SHA1 d681b992c9e027633a59fbd52530805ee4e1621c BUGS
SHA1 5176439f04e5492e6a3993a316d248175f83b594 CHANGES
SHA1 08a0302bf5a54d348b1c315933d0db360edfc645 CHANGES
SHA1 f27c8bd98e754f96c9825fa6ce9f1244c93bdbe6 CREDITS
SHA1 bc2db74538d3acd53f71b5512a144fe18c253ecd GOALS
SHA1 fe61299e80a1dca48fbaa33f0869e3238ec07c70 HISTORY
SHA1 d6a6c30ee6d9ba6b9afab8bbf6a25e1b23c744e0 LICENSE
SHA1 e717092a11b1e42a0a7b340c68e75fa84b8a68b8 MANIFEST
SHA1 d474e87288ac041eaac13acb7d6e4131602b1602 MANIFEST
SHA1 86df44fbe1ea7a68897113f0e327d0f0c25b91e3 MANIFEST.SKIP
SHA1 ea13a151a65b0bf6ddc87fcd38c599537d09f4bb META.json
SHA1 d197f1cef69a1c988a1c41d0269ac41b9766bd37 META.yml
SHA1 fa8f8556cf7f660211d5068468401e4215d54b69 META.json
SHA1 edbaf9b0f89f112d153397e9a7191cf80eb7f634 META.yml
SHA1 a57852f7db8fc4f38351154644964b93ff06f04d Makefile.PL
SHA1 4e2191d1724e699862efc5350f480c8e02755112 NEW
SHA1 813c62e6d3edd18b7b634765ecbd75b2cd6389a0 README
......@@ -40,10 +40,10 @@ SHA1 76efdca3603159e0ae0e18f19fe72a0211a69529 inc/Module/Install/Makefile.pm
SHA1 2e33e87882d60db3913da6284dd5295e5315e18a inc/Module/Install/Metadata.pm
SHA1 c830b819e61bda5eca077c6291293bba61b3b9f2 inc/Module/Install/Win32.pm
SHA1 cb52b9d6f88d512d448a6f35ed0af0d1201a134b inc/Module/Install/WriteAll.pm
SHA1 c7305d30bfa5d45468488580049d988484493e3a lib/Math/BigFloat.pm
SHA1 2499a3661b1b55d85a40b30d6536adf27b1eff3d lib/Math/BigInt.pm
SHA1 312cf1302bbd003016413393e5393752dcc56103 lib/Math/BigInt/Calc.pm
SHA1 5dda5ab049013116c3a35983f511fb7f20171b06 lib/Math/BigInt/CalcEmu.pm
SHA1 d927168e9cd177fe10ec24a463b64736dc8bab67 lib/Math/BigFloat.pm
SHA1 6109fdc265786cbeafb3cb4cfbe4dfce6edacbea lib/Math/BigInt.pm
SHA1 29966b0d690396bc9ecca5c667e6039ead92c215 lib/Math/BigInt/Calc.pm
SHA1 1f1b2469c429aa69994ff1a197645dabfae6bca4 lib/Math/BigInt/CalcEmu.pm
SHA1 385cc7ed3bf3e6290640b9880445ca9a3dea629e t/00sig.t
SHA1 4463fdcebb8421cc2e63f87d678adb47856bf58c t/01load.t
SHA1 b2ed9206ca5b69ec3b8bbf850bf4b6dfde518e7e t/02pod.t
......@@ -73,6 +73,7 @@ SHA1 c1f7b6840e772f2b6d4f8dbea4c28aaa675c9b17 t/config.t
SHA1 7c75531325efd55f15ef14e5ca22875d6d53e366 t/const_mbf.t
SHA1 b7891121243029ae078ca952205ce3d037b145d8 t/constant.t
SHA1 d5b1f2d01e954a8b0c41d51f79ec878a305cedf7 t/downgrade.t
SHA1 9c27ba015253129c87d7626f665704cef89a40ab t/from_hex-mbf.t
SHA1 048e4b172645392bac2d5b42a31c01b8ad74f5e2 t/inf_nan.t
SHA1 4ee46eecc74e97f27ef47b208576d179ab01cfb9 t/isa.t
SHA1 95d41431bb5147f2cd97d2f160c1ce220a365142 t/lib_load.t
......@@ -113,11 +114,11 @@ SHA1 01c5bfaa17310e1cea23ad46eacfe1613c291cac t/with_sub.t
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQEcBAEBAgAGBQJWP66kAAoJEGcmPl2fr166V70IAJp04sCaNomoPTo+ATvoOWCN
p2+HVnlmW3Ly2anaDGrB5t8TZDVS7qUAC+jx3RJBkFZ0n+PfO+VkeTi7QWCd3FyB
uuYvIMn8eOrQyLEWzOD6M8MgL7pvwmBX08HzwnEkNHvF4sE/MCA76RWwEzDhabD4
NIe2BAvCqjbs38oMcYIP3noULOiEUA7yydGV4bH04AzogNAN7NQhrEKQRjNuaddT
73WvhM2r1uBXA04o3weV0l62y94H0b9ILxNCqQLKeOBZ1L81/c+KKvk3EUpY8mdP
d9Nz6GexWknBiB7SrZ2871Fn/Z6c40NFez9FTaiMP3e0Bj+JudglEzq6omKDN3U=
=JOu/
iQEcBAEBAgAGBQJWRiteAAoJEGcmPl2fr166BocIALs7gPxfU64rHXW1qYmLP3rg
3q9mOGllBtPA7rDPFw9Byf9Q4BI/fa2FFfo3KaM71dcvOjRJIEoEHJKw87Jp7lwS
h/nQfaEdzPX52BL/aVi1PFzG2gfCMzerGYTq9hSmO3kL+mOO7wjq4n5GOUNU9rxo
q7YW0owDbrr0H0Bb8Z+1ymBp9oZvRvt+pYXs+Mc4CyyIVhmyheEfGHt35/wjSilG
znb5HVqQtqHVH8HS1q9NCx74Plrlq8CYPnqvcTenQtGoJVkv2zcfOSX9oIdEUv38
ma5l9DXw4lDxUHHvJqFgHVVW9Vyu50zLAn2mZuE02bdzoiYdlDRbufujtRkXl94=
=GT79
-----END PGP SIGNATURE-----
......@@ -16,7 +16,7 @@ use 5.006002;
use strict;
use warnings;
our $VERSION = '1.999709';
our $VERSION = '1.999710';
require Exporter;
our @ISA = qw/Math::BigInt/;
......@@ -4007,6 +4007,89 @@ sub length
$len;
}
sub from_hex {
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
my $str = shift;
$self = $class -> bzero() unless $selfref;
if ($str =~ s/
^
# sign
( [+-]? )
# optional "hex marker"
(?: 0? x )?
# significand using the hex digits 0..9 and a..f
(
[0-9a-fA-F]+ (?: _ [0-9a-fA-F]+ )*
(?:
\.
(?: [0-9a-fA-F]+ (?: _ [0-9a-fA-F]+ )* )?
)?
|
\.
[0-9a-fA-F]+ (?: _ [0-9a-fA-F]+ )*
)
# exponent (power of 2) using decimal digits
(?:
[Pp]
( [+-]? )
( \d+ (?: _ \d+ )* )
)?
$
//x)
{
my $s_sign = $1 || '+';
my $s_value = $2;
my $e_sign = $3 || '+';
my $e_value = $4 || '0';
$s_value =~ tr/_//d;
$e_value =~ tr/_//d;
# The significand must be multiplied by 2 raised to this exponent.
my $two_expon = $class -> new($e_value);
$two_expon -> bneg() if $e_sign eq '-';
# If there is a dot in the significand, remove it and adjust the
# exponent according to the number of digits in the fraction part of
# the significand. Multiply the exponent adjustment value by 4 since
# the digits in the significand are in base 16, but the exponent is
# only in base 2.
my $idx = index($s_value, '.');
if ($idx >= 0) {
substr($s_value, $idx, 1) = '';
$two_expon -= $class -> new(CORE::length($s_value))
-> bsub($idx)
-> bmul("4");
}
$self -> {sign} = $s_sign;
$self -> {_m} = $MBI -> _from_hex('0x' . $s_value);
if ($two_expon > 0) {
my $factor = $class -> new("2") -> bpow($two_expon);
$self -> bmul($factor);
} elsif ($two_expon < 0) {
my $factor = $class -> new("0.5") -> bpow(-$two_expon);
$self -> bmul($factor);
}
return $self;
}
return $self->bnan();
}
1;
__END__
......@@ -4030,6 +4113,9 @@ Math::BigFloat - Arbitrary size floating point math package
my $inf = Math::BigFloat->binf('-'); # create a -inf
my $one = Math::BigFloat->bone(); # create a +1
my $mone = Math::BigFloat->bone('-'); # create a -1
my $x = Math::BigFloat->bone('-'); #
my $h = Math::BigFloat->from_hex('0xc.afep+3'); # from hexadecimal
my $pi = Math::BigFloat->bpi(100); # PI to 100 digits
......@@ -4496,6 +4582,17 @@ C<ref($x)-E<gt>new()> can parse to create an object.
In Math::BigFloat, C<as_float()> has the same effect as C<copy()>.
=item from_hex()
$x -> from_hex("0x1.921fb54442d18p+1");
$x = Math::BigFloat -> from_hex("0x1.921fb54442d18p+1");
Interpret input as a hexadecimal string. A "0x" or "x" prefix is optional. A
single underscore character may be placed between any two digits. If the input
is invalid, a NaN is returned. The exponent is in base 2 using decimal digits.
If called as an instance method, the value is assigned to the invocand.
=back
=head1 Autocreating constants
......
......@@ -19,7 +19,7 @@ use 5.006002;
use strict;
use warnings;
our $VERSION = '1.999709';
our $VERSION = '1.999710';
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(objectify bgcd blcm);
......@@ -3505,6 +3505,8 @@ Math::BigInt - Arbitrary size integer/float math package
$h = Math::BigInt->new('0x123'); # from hexadecimal
$b = Math::BigInt->new('0b101'); # from binary
$o = Math::BigInt->from_oct('0101'); # from octal
$h = Math::BigInt->from_hex('cafe'); # from hexadecimal
$b = Math::BigInt->from_bin('0101'); # from binary
# Testing (don't modify their arguments)
# (return true if the condition is met, otherwise false)
......
......@@ -4,7 +4,7 @@ use 5.006002;
use strict;
use warnings;
our $VERSION = '1.999709';
our $VERSION = '1.999710';
# Package to store unsigned big integers in decimal and do math with them
......
......@@ -4,7 +4,7 @@ use 5.006002;
use strict;
use warnings;
our $VERSION = '1.999709';
our $VERSION = '1.999710';
package Math::BigInt;
......
#!perl
use strict;
use warnings;
use Test::More tests => 27;
my $class;
BEGIN { $class = 'Math::BigFloat'; }
BEGIN { use_ok($class, '1.999710'); }
while (<DATA>) {
s/\s+\z//;
next if /^#/ || ! /\S/;
my ($in0, $out0) = split /:/;
my $x;
my $test = qq|\$x = $class -> from_hex("$in0");|;
my $desc = $test;
print("#\n",
"# Now about to execute the following test.\n",
"#\n",
"# $test\n",
"#\n");
eval $test;
die $@ if $@; # this should never happen
subtest $desc, sub {
plan tests => 2,
# Check output.
is(ref($x), $class, "output arg is a $class");
is($x, $out0, 'output arg has the right value');
};
}
__END__
0x1p+0:1
0x.8p+1:1
0x.4p+2:1
0x.2p+3:1
0x.1p+4:1
0x2p-1:1
0x4p-2:1
0x8p-3:1
-0x1p+0:-1
0x0p+0:0
0x0p+7:0
0x0p-7:0
0x0.p+0:0
0x.0p+0:0
0x0.0p+0:0
0xcafe:51966
xcafe:51966
cafe:51966
0x1.9p+3:12.5
0x12.34p-1:9.1015625
-0x.789abcdefp+32:-2023406814.9375
0x12.3456789ap+31:39093746765
NaN:NaN
+inf:NaN
-inf:NaN
0x.p+0:NaN
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment