Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-Math-BigInt for
openSUSE:Factory checked in at 2022-04-25 23:35:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Math-BigInt (Old)
and /work/SRC/openSUSE:Factory/.perl-Math-BigInt.new.1538 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Math-BigInt"
Mon Apr 25 23:35:31 2022 rev:40 rq:972542 version:1.999830
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Math-BigInt/perl-Math-BigInt.changes
2022-01-17 22:35:04.650284719 +0100
+++
/work/SRC/openSUSE:Factory/.perl-Math-BigInt.new.1538/perl-Math-BigInt.changes
2022-04-25 23:35:42.814432111 +0200
@@ -1,0 +2,11 @@
+Wed Apr 13 03:07:41 UTC 2022 - Tina M??ller <[email protected]>
+
+- updated to 1.999830
+ see /usr/share/doc/packages/perl-Math-BigInt/CHANGES
+
+ 1.999830 2022-04-11
+
+ * Improve upgrading and downgrading. This work is not complete. Some methods
+ still don't downgrade when they should.
+
+-------------------------------------------------------------------
Old:
----
Math-BigInt-1.999829.tar.gz
New:
----
Math-BigInt-1.999830.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Math-BigInt.spec ++++++
--- /var/tmp/diff_new_pack.QE2Aam/_old 2022-04-25 23:35:43.290432777 +0200
+++ /var/tmp/diff_new_pack.QE2Aam/_new 2022-04-25 23:35:43.294432783 +0200
@@ -18,10 +18,10 @@
%define cpan_name Math-BigInt
Name: perl-Math-BigInt
-Version: 1.999829
+Version: 1.999830
Release: 0
-Summary: Arbitrary size integer/float math package
License: Artistic-1.0 OR GPL-1.0-or-later
+Summary: Arbitrary size integer math package
URL: https://metacpan.org/release/%{cpan_name}
Source0:
https://cpan.metacpan.org/authors/id/P/PJ/PJACKLAM/%{cpan_name}-%{version}.tar.gz
Source1: cpanspec.yml
++++++ Math-BigInt-1.999829.tar.gz -> Math-BigInt-1.999830.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/CHANGES
new/Math-BigInt-1.999830/CHANGES
--- old/Math-BigInt-1.999829/CHANGES 2021-12-30 20:11:37.000000000 +0100
+++ new/Math-BigInt-1.999830/CHANGES 2022-04-11 08:19:14.000000000 +0200
@@ -1,3 +1,8 @@
+1.999830 2022-04-11
+
+ * Improve upgrading and downgrading. This work is not complete. Some methods
+ still don't downgrade when they should.
+
1.999829 2021-12-29
* Improve methods div_scale() and round_mode() so they work better with
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/META.json
new/Math-BigInt-1.999830/META.json
--- old/Math-BigInt-1.999829/META.json 2021-12-31 07:18:14.000000000 +0100
+++ new/Math-BigInt-1.999830/META.json 2022-04-11 19:41:24.000000000 +0200
@@ -4,7 +4,7 @@
"Peter John Acklam <[email protected]>"
],
"dynamic_config" : 1,
- "generated_by" : "ExtUtils::MakeMaker version 7.44, CPAN::Meta::Converter
version 2.150010",
+ "generated_by" : "ExtUtils::MakeMaker version 7.64, CPAN::Meta::Converter
version 2.150010",
"license" : [
"perl_5"
],
@@ -50,6 +50,6 @@
"web" : "https://github.com/pjacklam/p5-Math-BigInt"
}
},
- "version" : "1.999829",
+ "version" : "1.999830",
"x_serialization_backend" : "JSON::PP version 4.04"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/META.yml
new/Math-BigInt-1.999830/META.yml
--- old/Math-BigInt-1.999829/META.yml 2021-12-31 07:18:11.000000000 +0100
+++ new/Math-BigInt-1.999830/META.yml 2022-04-11 19:41:20.000000000 +0200
@@ -7,7 +7,7 @@
configure_requires:
ExtUtils::MakeMaker: '6.58'
dynamic_config: 1
-generated_by: 'ExtUtils::MakeMaker version 7.44, CPAN::Meta::Converter version
2.150010'
+generated_by: 'ExtUtils::MakeMaker version 7.64, CPAN::Meta::Converter version
2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -24,5 +24,5 @@
perl: '5.006001'
resources:
repository: https://github.com/pjacklam/p5-Math-BigInt.git
-version: '1.999829'
+version: '1.999830'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/SIGNATURE
new/Math-BigInt-1.999830/SIGNATURE
--- old/Math-BigInt-1.999829/SIGNATURE 2021-12-31 07:22:11.000000000 +0100
+++ new/Math-BigInt-1.999830/SIGNATURE 2022-04-11 19:41:37.000000000 +0200
@@ -15,15 +15,15 @@
Hash: RIPEMD160
SHA256 961f8c23b6fc94cb9766265257dd548b190087df0c71dfd7d994bc649af5f002 BUGS
-SHA256 fc2051a38c658300221d137f958f03b476a9231e7b1261c927da7d88dd97abab CHANGES
+SHA256 f27269756b7097265fb31f22caa2f8b96527d4e96d9d506132e93f10657ddff1 CHANGES
SHA256 7d84c6e69ee6c3ab6301314d2fa4bc233f24bd36a4a546b2cfd05a078bda98b7 CREDITS
SHA256 fd8f78318c23adef95971cc01ee0e79d68f52f60b761ba28129c8509fff46954 GOALS
SHA256 28e80ee628ff111dd34a2a26af921693c9c823caadab30c848e4c4f4fc00830f HISTORY
SHA256 b857edab549ac6893e2df5e1ec768ee46b62bcf1607a55e876f4d23f079eacce LICENSE
SHA256 8ad41a4a11bfa5a79a24f42fdd2d034119f68b8a45994f430886213293a38549
MANIFEST
SHA256 6cbc650165422bed661f292abb91ffaefa416830203a2aa8c790114ce6535cde
MANIFEST.SKIP
-SHA256 155a2bf7721d82cc136010d4ac7f1d3090dc349c81848b1071afbda66cab788a
META.json
-SHA256 ba54b6aaa68239592e1369979840f97be610b2246ae7de87319050cacbe7ed8c
META.yml
+SHA256 678115f83839213ec5fcc0e57006a6386bf5b1ffa8b6d22083f22e832774e7bc
META.json
+SHA256 b2d8fed4d7a1a24cf258599b52e4e26993f90be7e40f0c2da97a7663465f0552
META.yml
SHA256 053b2511fa5ac8e6141b5596d6777220ef257a5ddfda3f3ff7325907757660a7
Makefile.PL
SHA256 99f7f7df45a00c9f19ad38edec8c5dad5f5977c2b1a14ac3bb491ac193db1f7d NEW
SHA256 2aadb8383836311d8b47a34b7eb1c68043ccd5b90bfc2d9c57016b33579d2385 README
@@ -32,10 +32,10 @@
SHA256 77a80748e329a042faaa91eb0b44a493dfdfd726fec854a1a376c8404324b485
examples/1000.txt
SHA256 702e323f59be58db758a3fa70ffe5fb80d392043bb855b0f172dd748809435df
examples/bigprimes.pl
SHA256 81a3ff3476038ec839c12a2b3548898055112bebc81fbf3513ee5efd6adfd0bd
examples/prime.pl
-SHA256 0a8b0bd9ed54b5e1e487c809e1acdea4ed680078c861f924cb8db8d7e7d628a5
lib/Math/BigFloat.pm
-SHA256 bec3bcae7574ba141642227bcb7c1d37e090ef78ef8287eb54fff22f10345755
lib/Math/BigInt.pm
-SHA256 ac5c5b684286e812fd6ac7b9b27b3df399921f432680b69ced8e2182fba21952
lib/Math/BigInt/Calc.pm
-SHA256 ac22d1cbe00be0d8e5a32b639f62815d4496f44a1547149cca4363b09533ee85
lib/Math/BigInt/Lib.pm
+SHA256 04a85f05f9c10f147a74c2a422985f7d4e983748a8ffd368f3a6f8e936023b57
lib/Math/BigFloat.pm
+SHA256 f51b2c418456059bf622f8052e444cbf78f97e51450d73c9afb693d4d13de18e
lib/Math/BigInt.pm
+SHA256 69905767fc7fd1d3d053666ed9c0fe352659a9e3b407bf44bf80d88b85d608ab
lib/Math/BigInt/Calc.pm
+SHA256 ee4e0e1729abd17f0ae413b577f4418cad99bbd00712efe4703cfcb51ab21c55
lib/Math/BigInt/Lib.pm
SHA256 f855e68d0f171debf8369ead8b36d004188f1c9069287a0d3c67a87f9afb1312
t/00sig.t
SHA256 64c07f96b6a1d6adb075f40bf2dc496fd7951b653458bd9f826e4f76f8e5423d
t/01load.t
SHA256 a756e0bc9a221303e562d0f25969965962e6121605ee9bb0ee3cb54e69dd2222
t/Math/BigFloat/Subclass.pm
@@ -92,7 +92,7 @@
SHA256 f07e3567088a090d21831714a0ecb3a6f697eb470d3125690a89e6d515e845a7
t/config.t
SHA256 2ae8168531ed6415bdb20ec7aea33e77fb27f5b3236800e7fb0f139f400bc46a
t/const-mbf.t
SHA256 fe3ebc915d56ac4bbb3dbbdc91a9b25d56dbfcdd4da06c1aa44473a036d6e5f6
t/const-mbi.t
-SHA256 edc69ab08976345088b5ce485ecc6cee0df5ae6c62748d80fc25f85d979e7c32
t/downgrade.t
+SHA256 264117e304286b0752651e8964ceac739763f2bc0a5a7d509898112bd69ec70b
t/downgrade.t
SHA256 3b4f29c10335315aa9a7f43b496c32313ddd535b439f0e02000502077a964e5e
t/dparts-mbf.t
SHA256 20885f8ff653f1b7f03960ef1c2a83c227e4b045bb6977716da88f58753046d0
t/dparts-mbi.t
SHA256 1214cb07c16402a1800db390f280a868765f1d6378282f6fd680d205bd0b47df
t/eparts-mbf.t
@@ -145,7 +145,7 @@
SHA256 a6c426fbe3be51614bba597884ccb3313e8896491f38c0443d8fa89b62b67d67
t/to_ieee754-mbf.t
SHA256 733212fb1e51087fbbd66327659d4b4495f1464b3c19fd5069ab5cfdbcf5cec1
t/trap.t
SHA256 c3c25192c24ce16d99ce65e7f540aeb95d48e25e8e6de7800ccbc3a26ae8e301
t/upgrade.inc
-SHA256 4b38e59dc5af4860466b7897429b239111c8547a46a993ea860b86868283f9fa
t/upgrade.t
+SHA256 98af14554fc72403105b8fa4d21040c052bb33edc2cf3bb5acc0e8b34e590b3d
t/upgrade.t
SHA256 9ac713f4e86b7d682608372d672a1d078320b605fd704dfbecd3eda0eb9403e7
t/upgrade2.t
SHA256 01b543fd9de9aacb54d5d4c64479a064e9c5e3050f9f79b88c0d8d5d2d858f4a
t/upgradef.t
SHA256 abb78d9e1b5f3bbb798f28050130d1fe03bfe61e6a8cb2110ea12795a1d5a850 t/use.t
@@ -282,7 +282,7 @@
SHA256 594dcd1659befa019adbd521d4c8c60fc9f1446688b011780655272e6a56b61a
xt/release/cpan-changes.t
SHA256 befb07cbace153e844bd1aa24309e8136f0265cc97708bfb2f5f427964f7a88d
xt/release/dist-manifest.t
SHA256 dfba9c5f1e2b047a07c92747e523aceeab0d692a1bf655c2658386e45d9b4311
xt/release/distmeta.t
-SHA256 9ce5216bb53107eaa7572564e87d15ac7749233b9c58a482de02cdf603ed2409
xt/release/git.t
+SHA256 2f6418e76023a02d013902d68fb5d7a957bb4ba09b6150b05a4baf2efcd73386
xt/release/git.t
SHA256 ab76d17849b85e317470c4307f01cc9f8c4e0bbc78556d61b4fd572f16eca31c
xt/release/kwalitee.t
SHA256 c6f4a981a4c1990e5f524646375b7b219c29cba04869438e5463c096c808bf09
xt/release/minimum-version.t
SHA256 0d68719572b113c9a2f017b87c31ee934dfd016859c67772e50fddaab904eb07
xt/release/pod-coverage.t
@@ -294,11 +294,11 @@
SHA256 7aa223732dec88d581e015ac171308b256a9d061ea3c832ad4f7048266226e97
xt/release/whitespaces.t
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBAwAGBQJhzqCpAAoJEGcmPl2fr166CdQH/iYh739CuyZ1HoQktEL1h4Gh
-JhiyAhhagMlEEBc2dn5ZHbBb5bQCQg8fEDKlcAnw4f9c9eunWA9I1W1hePjWRBkV
-uysRXbCc27W+og+hz272CnUU3Zy0VfNoeYq7+fsPmwI3BJycLZetzlpl+FVAv73B
-pmMA0Yj7jmrsiMx0XoSZKe6iilu0xbbXDKA/LYYfdOEvqrelrdn5VVMajb5XVZ8z
-VhzhzQnerF1vIwR1cYuCZkDg0SWZBAJJ9mwQxXKjAFtlQkKxEkk3NTN6rDWkw+/k
-r+MTDpv15w1hT7+zCmIaOMZkb6ZcW3DLWIb1MdZhPwFSDD9e+Eiy0TzGTUvaRI0=
-=db4E
+iQEcBAEBAwAGBQJiVGhIAAoJEGcmPl2fr166ngsH/jL0YJIr6l4qVBHCDq85b1YH
+rAfKrq92lBLprJi416d+HSPVs0movDdFXXk9yo54ReDOqcLzztrekAmJtr7gUgg1
+hnEO9VFcLRCeykxLOWv4SP5NhiviUL2Y+8nBzpFX5MIeUdlH970d5YvJxifvVuMz
+gPl0javjfaiZll85xD6T+9/VE2Ju7e3Iakc37XBBD/kW9zP92cfVAAm5Nar9hn43
+7MkViM9FS5TXzEE5x3nYZPvNEZ726gJDi4DYXdoPTFoz201Zy2UrXGodqKc9jvom
+GDWwiAMtDjf2+BUx7I99+vUe+gsTAThtkWsT4tnjLSccpjZ1XCqMKfZACVMVH7A=
+=8r1O
-----END PGP SIGNATURE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/lib/Math/BigFloat.pm
new/Math-BigInt-1.999830/lib/Math/BigFloat.pm
--- old/Math-BigInt-1.999829/lib/Math/BigFloat.pm 2021-12-29
19:28:07.000000000 +0100
+++ new/Math-BigInt-1.999830/lib/Math/BigFloat.pm 2022-04-11
17:25:03.000000000 +0200
@@ -20,7 +20,8 @@
use Scalar::Util qw< blessed >;
use Math::BigInt qw< >;
-our $VERSION = '1.999829';
+our $VERSION = '1.999830';
+$VERSION =~ tr/_//d;
require Exporter;
our @ISA = qw/Math::BigInt/;
@@ -426,11 +427,10 @@
}
}
-
# Handle Infs.
if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) {
- return $downgrade->new($wanted) if $downgrade;
+ return $downgrade->new($wanted) if defined $downgrade;
my $sgn = $1 || '+';
$self = $class -> binf($sgn);
$self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
@@ -440,7 +440,7 @@
# Handle explicit NaNs (not the ones returned due to invalid input).
if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) {
- return $downgrade->new($wanted) if $downgrade;
+ return $downgrade->new($wanted) if defined $downgrade;
$self = $class -> bnan();
$self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1];
return $self;
@@ -457,7 +457,7 @@
$
/x)
{
- return $downgrade->new($1 . $2) if $downgrade;
+ return $downgrade->new($1 . $2) if defined $downgrade;
$self->{sign} = $1 || '+';
$self->{_m} = $LIB -> _new($2);
$self->{_es} = '+';
@@ -513,7 +513,6 @@
# The value is an integer iff the exponent is non-negative.
if ($parts[2] eq '+' && $downgrade) {
- #return $downgrade->new($str, @r);
return $downgrade->new($wanted, @r);
}
@@ -548,9 +547,8 @@
# The value is an integer iff the exponent is non-negative.
- if ($parts[2] eq '+' && $downgrade) {
- #$str = $parts[0] . $LIB -> _lsft($parts[1], $parts[3], 10);
- return $downgrade->new($str, @r);
+ if ($parts[2] eq '+') {
+ return $downgrade->new($str, @r) if defined $downgrade;
}
($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
@@ -581,8 +579,7 @@
# The value is an integer iff the exponent is non-negative.
- if ($parts[2] eq '+' && $downgrade) {
- #$str = $parts[0] . $LIB -> _lsft($parts[1], $parts[3], 10);
+ if ($parts[2] eq '+' && defined $downgrade) {
return $downgrade -> from_hex($str, @r);
}
@@ -614,9 +611,8 @@
# The value is an integer iff the exponent is non-negative.
- if ($parts[2] eq '+' && $downgrade) {
- #$str = $parts[0] . $LIB -> _lsft($parts[1], $parts[3], 10);
- return $downgrade -> from_oct($str, @r);
+ if ($parts[2] eq '+') {
+ return $downgrade -> from_oct($str, @r) if defined $downgrade;
}
($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
@@ -647,9 +643,8 @@
# The value is an integer iff the exponent is non-negative.
- if ($parts[2] eq '+' && $downgrade) {
- #$str = $parts[0] . $LIB -> _lsft($parts[1], $parts[3], 10);
- return $downgrade -> from_bin($str, @r);
+ if ($parts[2] eq '+') {
+ return $downgrade -> from_bin($str, @r) if defined $downgrade;
}
($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
@@ -814,6 +809,9 @@
} else {
$self = $x;
}
+
+ return $downgrade -> new($x, @r)
+ if defined($downgrade) && $x -> is_int();
return $self -> round(@r);
}
@@ -836,6 +834,8 @@
$self->import() if $IMPORT == 0; # make require work
return if $selfref && $self->modify('bzero');
+ return $downgrade->bzero() if defined $downgrade;
+
$self = bless {}, $class unless $selfref;
$self -> {sign} = '+';
@@ -878,6 +878,8 @@
$self->import() if $IMPORT == 0; # make require work
return if $selfref && $self->modify('bone');
+ return $downgrade->bone() if defined $downgrade;
+
my $sign = shift;
$sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
@@ -918,6 +920,8 @@
unshift @_, __PACKAGE__;
}
+ return $downgrade->binf(@_) if defined $downgrade;
+
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
@@ -970,6 +974,8 @@
unshift @_, __PACKAGE__;
}
+ return $downgrade->bnan(@_) if defined $downgrade;
+
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
@@ -1050,7 +1056,7 @@
{
$r[0] = $self;
$class = __PACKAGE__;
- $self = $class -> bzero(@r); # initialize
+ $self = bless {}, $class; # initialize
}
# ... or if bpi() is called as a method ...
@@ -1060,7 +1066,7 @@
if ($selfref) { # bpi() called as instance method
return $self if $self -> modify('bpi');
} else { # bpi() called as class method
- $self = $class -> bzero(@r); # initialize
+ $self = bless {}, $class; # initialize
}
}
@@ -1509,14 +1515,21 @@
# for +0 do not negate (to have always normalized +0). Does nothing for
'NaN'
$x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' &&
$LIB->_is_zero($x->{_m}));
- $x;
+
+ return $downgrade -> new($x)
+ if defined($downgrade) && ($x -> is_int() || $x -> is_inf() || $x ->
is_nan());
+ return $x;
}
sub bnorm {
# adjust m and e so that m is smallest possible
my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
- return $x if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ # inf, nan etc
+ if ($x->{sign} !~ /^[+-]$/) {
+ return $downgrade->new($x) if defined $downgrade;
+ return $x;
+ }
my $zeros = $LIB->_zeros($x->{_m}); # correct for trailing zeros
if ($zeros != 0) {
@@ -1540,6 +1553,7 @@
if $LIB->_is_zero($x->{_m});
}
+ return $downgrade->new($x) if defined($downgrade) && $x->is_int();
$x;
}
@@ -1614,6 +1628,7 @@
# set up parameters
my ($class, $x, $y, @r) = (ref($_[0]), @_);
+
# objectify is costly, so avoid it
if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
($class, $x, $y, @r) = objectify(2, @_);
@@ -1622,17 +1637,25 @@
return $x if $x->modify('badd');
# inf and NaN handling
- if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) {
+ if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
+
# NaN first
- return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+ if ($x->{sign} eq $nan || $y->{sign} eq $nan) {
+ $x->bnan();
+ }
+
# inf handling
- if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/)) {
+ elsif ($x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/) {
# +inf++inf or -inf+-inf => same, rest is NaN
- return $x if $x->{sign} eq $y->{sign};
- return $x->bnan();
+ $x->bnan() if $x->{sign} ne $y->{sign};
}
+
# +-inf + something => +inf; something +-inf => +-inf
- $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
+ elsif ($y->{sign} =~ /^[+-]inf$/) {
+ $x->{sign} = $y->{sign};
+ }
+
+ return $downgrade->new($x, @r) if defined $downgrade;
return $x;
}
@@ -1641,55 +1664,61 @@
$r[3] = $y; # no push!
- # speed: no add for 0+y or x+0
- return $x->bround(@r) if $y->is_zero(); # x+0
- if ($x->is_zero()) # 0+y
- {
+ # for speed: no add for $x + 0
+ if ($y->is_zero()) {
+ $x->bround(@r);
+ }
+
+ # for speed: no add for 0 + $y
+ elsif ($x->is_zero()) {
# make copy, clobbering up x (modify in place!)
$x->{_e} = $LIB->_copy($y->{_e});
$x->{_es} = $y->{_es};
$x->{_m} = $LIB->_copy($y->{_m});
$x->{sign} = $y->{sign} || $nan;
- return $x->round(@r);
+ $x->round(@r);
}
- # take lower of the two e's and adapt m1 to it to match m2
- my $e = $y->{_e};
- $e = $LIB->_zero() if !defined $e; # if no BFLOAT?
- $e = $LIB->_copy($e); # make copy (didn't do it yet)
+ else {
- my $es;
+ # take lower of the two e's and adapt m1 to it to match m2
+ my $e = $y->{_e};
+ $e = $LIB->_zero() if !defined $e; # if no BFLOAT?
+ $e = $LIB->_copy($e); # make copy (didn't do it yet)
- ($e, $es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es});
- #($e, $es) = $LIB -> _ssub($e, $y->{_es} || '+', $x->{_e}, $x->{_es});
+ my $es;
- my $add = $LIB->_copy($y->{_m});
+ ($e, $es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es});
+ #($e, $es) = $LIB -> _ssub($e, $y->{_es} || '+', $x->{_e}, $x->{_es});
- if ($es eq '-') # < 0
- {
- $x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
- ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
- #$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
- #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
+ my $add = $LIB->_copy($y->{_m});
- } elsif (!$LIB->_is_zero($e)) # > 0
- {
- $add = $LIB->_lsft($add, $e, 10);
- }
- # else: both e are the same, so just leave them
+ if ($es eq '-') { # < 0
+ $x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
+ ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
+ #$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
+ #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e,
$es);
+ } elsif (!$LIB->_is_zero($e)) { # > 0
+ $add = $LIB->_lsft($add, $e, 10);
+ }
- if ($x->{sign} eq $y->{sign}) {
- # add
- $x->{_m} = $LIB->_add($x->{_m}, $add);
- } else {
- ($x->{_m}, $x->{sign}) =
- _e_add($x->{_m}, $add, $x->{sign}, $y->{sign});
- #($x->{_m}, $x->{sign}) =
- # $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $y->{sign});
+ # else: both e are the same, so just leave them
+
+ if ($x->{sign} eq $y->{sign}) {
+ $x->{_m} = $LIB->_add($x->{_m}, $add);
+ } else {
+ ($x->{_m}, $x->{sign}) =
+ _e_add($x->{_m}, $add, $x->{sign}, $y->{sign});
+ #($x->{_m}, $x->{sign}) =
+ # $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $y->{sign});
+ }
+
+ # delete trailing zeros, then round
+ $x->bnorm()->round(@r);
}
- # delete trailing zeros, then round
- $x->bnorm()->round(@r);
+ return $downgrade->new($x, @r) if defined($downgrade) && $x -> is_int();
+ return $x;
}
sub bsub {
@@ -1709,21 +1738,31 @@
return $upgrade -> new($x) -> bsub($upgrade -> new($y), @r)
if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class));
- return $x -> round(@r) if $y -> is_zero();
+ if ($y -> is_zero()) {
+ $x -> round(@r);
+ } else {
- # To correctly handle the lone special case $x -> bsub($x), we note the
- # sign of $x, then flip the sign from $y, and if the sign of $x did change,
- # too, then we caught the special case:
-
- my $xsign = $x -> {sign};
- $y -> {sign} =~ tr/+-/-+/; # does nothing for NaN
- if ($xsign ne $x -> {sign}) {
- # special case of $x -> bsub($x) results in 0
- return $x -> bzero(@r) if $xsign =~ /^[+-]$/;
- return $x -> bnan(); # NaN, -inf, +inf
+ # To correctly handle the special case $x -> bsub($x), we note the sign
+ # of $x, then flip the sign of $y, and if the sign of $x changed too,
+ # then we know that $x and $y are the same object.
+
+ my $xsign = $x -> {sign};
+ $y -> {sign} =~ tr/+-/-+/; # does nothing for NaN
+ if ($xsign ne $x -> {sign}) {
+ # special case of $x -> bsub($x) results in 0
+ if ($xsign =~ /^[+-]$/) {
+ $x -> bzero(@r);
+ } else {
+ $x -> bnan(); # NaN, -inf, +inf
+ }
+ return $downgrade->new($x, @r) if defined $downgrade;
+ return $x;
+ }
+ $x = $x -> badd($y, @r); # badd does not leave internal zeros
+ $y -> {sign} =~ tr/+-/-+/; # reset $y (does nothing for NaN)
}
- $x -> badd($y, @r); # badd does not leave internal zeros
- $y -> {sign} =~ tr/+-/-+/; # refix $y (does nothing for NaN)
+ return $downgrade->new($x, @r)
+ if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
$x; # already rounded by badd() or no rounding
}
@@ -1804,7 +1843,11 @@
$x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+';
# z=inf handling (z=NaN handled above)
- $x->{sign} = $z->{sign}, return $x if $z->{sign} =~ /^[+-]inf$/;
+ if ($z->{sign} =~ /^[+-]inf$/) {
+ $x->{sign} = $z->{sign};
+ return $downgrade->new($x) if defined $downgrade;
+ return $x;
+ }
# take lower of the two e's and adapt m1 to it to match m2
my $e = $z->{_e};
@@ -1933,9 +1976,6 @@
# x == 0?
return wantarray ? ($x, $class->bzero()) : $x if $x->is_zero();
- # upgrade ?
- return $upgrade->bdiv($upgrade->new($x), $y, $a, $p, $r) if defined
$upgrade;
-
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my (@params, $scale);
@@ -2034,8 +2074,14 @@
# clear a/p after round, since user did not request it
delete $rem->{_a}; delete $rem->{_p};
}
+ $x = $downgrade -> new($x)
+ if defined($downgrade) && $x -> is_int();
+ $rem = $downgrade -> new($rem)
+ if defined($downgrade) && $rem -> is_int();
return ($x, $rem);
}
+
+ $x = $downgrade -> new($x) if defined($downgrade) && $x -> is_int();
$x;
}
@@ -3633,24 +3679,42 @@
croak('bround() needs positive accuracy');
}
+ return $x if $x->modify('bround');
+
my ($scale, $mode) = $x->_scale_a(@_);
- return $x if !defined $scale || $x->modify('bround'); # no-op
+ if (!defined $scale) { # no-op
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
- # scale is now either $x->{_a}, $accuracy, or the user parameter
- # test whether $x already has lower accuracy, do nothing in this case
- # but do round if the accuracy is the same, since a math operation might
- # want to round a number with A=5 to 5 digits afterwards again
- return $x if defined $x->{_a} && $x->{_a} < $scale;
+ # Scale is now either $x->{_a}, $accuracy, or the input argument. Test
+ # whether $x already has lower accuracy, do nothing in this case but do
+ # round if the accuracy is the same, since a math operation might want to
+ # round a number with A=5 to 5 digits afterwards again
+
+ if (defined $x->{_a} && $x->{_a} < $scale) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
# scale < 0 makes no sense
# scale == 0 => keep all digits
# never round a +-inf, NaN
- return $x if ($scale <= 0) || $x->{sign} !~ /^[+-]$/;
+
+ if ($scale <= 0 || $x->{sign} !~ /^[+-]$/) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
# 1: never round a 0
# 2: if we should keep more digits than the mantissa has, do nothing
if ($x->is_zero() || $LIB->_len($x->{_m}) <= $scale) {
$x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale;
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3661,6 +3725,8 @@
$x->{_m} = $m->{value}; # get our mantissa back
$x->{_a} = $scale; # remember rounding
delete $x->{_p}; # and clear P
+
+ # bnorm() downgrades if necessary, so no need to check whether to
downgrade.
$x->bnorm(); # del trailing zeros gen. by bround()
}
@@ -3672,25 +3738,47 @@
my $class = ref($x) || $x;
$x = $class->new(shift) if !ref($x);
+ return $x if $x->modify('bfround'); # no-op
+
my ($scale, $mode) = $x->_scale_p(@_);
- return $x if !defined $scale || $x->modify('bfround'); # no-op
+ if (!defined $scale) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
# never round a 0, +-inf, NaN
+
if ($x->is_zero()) {
$x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
+
+ if ($x->{sign} !~ /^[+-]$/) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
- return $x if $x->{sign} !~ /^[+-]$/;
# don't round if x already has lower precision
- return $x if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p});
+ if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p}) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
$x->{_p} = $scale; # remember round in any case
delete $x->{_a}; # and clear A
if ($scale < 0) {
# round right from the '.'
- return $x if $x->{_es} eq '+'; # e >= 0 => nothing to round
+ if ($x->{_es} eq '+') { # e >= 0 => nothing to round
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
$scale = -$scale; # positive for simplicity
my $len = $LIB->_len($x->{_m}); # length of mantissa
@@ -3710,13 +3798,22 @@
# 1.2345 12345e-4 5 0 4
# do not round after/right of the $dad
- return $x if $scale > $dad; # 0.123, scale >= 3 => exit
+
+ if ($scale > $dad) { # 0.123, scale >= 3 => exit
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
# round to zero if rounding inside the $zad, but not for last zero
like:
# 0.0065, scale -2, round last '0' with following '65' (scale == zad
case)
- return $x->bzero() if $scale < $zad;
- if ($scale == $zad) # for 0.006, scale -3 and trunc
- {
+ if ($scale < $zad) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x->bzero();
+ }
+
+ if ($scale == $zad) { # for 0.006, scale -3 and trunc
$scale = -$len;
} else {
# adjust round-point to be inside mantissa
@@ -3739,12 +3836,17 @@
# should be the same, so treat it as this
$scale = 1 if $scale == 0;
# shortcut if already integer
- return $x if $scale == 1 && $dbt <= $dbd;
+ if ($scale == 1 && $dbt <= $dbd) {
+ return $downgrade->new($x) if defined($downgrade)
+ && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
+ }
# maximum digits before dot
++$dbd;
if ($scale > $dbd) {
# not enough digits before dot, so round to zero
+ return $downgrade->new($x) if defined($downgrade);
return $x->bzero;
} elsif ($scale == $dbd) {
# maximum
@@ -3753,66 +3855,81 @@
$scale = $dbd - $scale;
}
}
+
# pass sign to bround for rounding modes '+inf' and '-inf'
my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
$m->bround($scale, $mode);
$x->{_m} = $m->{value}; # get our mantissa back
+
+ # bnorm() downgrades if necessary, so no need to check whether to
downgrade.
$x->bnorm();
}
sub bfloor {
# round towards minus infinity
- my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1,
@_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bfloor');
- return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
- # if $x has digits after dot
- if ($x->{_es} eq '-') {
- $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # cut off digits after
dot
- $x->{_e} = $LIB->_zero(); # trunc/norm
- $x->{_es} = '+'; # abs e
- $x->{_m} = $LIB->_inc($x->{_m}) if $x->{sign} eq '-'; # increment
if negative
+ if ($x->{sign} =~ /^[+-]$/) {
+ # if $x has digits after dot, remove them
+ if ($x->{_es} eq '-') {
+ $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10);
+ $x->{_e} = $LIB->_zero();
+ $x->{_es} = '+';
+ # increment if negative
+ $x->{_m} = $LIB->_inc($x->{_m}) if $x->{sign} eq '-';
+ }
+ $x->round(@r);
}
- $x->round($a, $p, $r);
+ return $downgrade->new($x, @r) if defined($downgrade);
+ return $x;
}
sub bceil {
# round towards plus infinity
- my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1,
@_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bceil');
- return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
- # if $x has digits after dot
- if ($x->{_es} eq '-') {
- $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # cut off digits after
dot
- $x->{_e} = $LIB->_zero(); # trunc/norm
- $x->{_es} = '+'; # abs e
- if ($x->{sign} eq '+') {
- $x->{_m} = $LIB->_inc($x->{_m}); # increment if positive
- } else {
- $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # avoid -0
+ # if $x has digits after dot, remove them
+ if ($x->{sign} =~ /^[+-]$/) {
+ if ($x->{_es} eq '-') {
+ $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10);
+ $x->{_e} = $LIB->_zero();
+ $x->{_es} = '+';
+ if ($x->{sign} eq '+') {
+ $x->{_m} = $LIB->_inc($x->{_m}); # increment if positive
+ } else {
+ $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # avoid -0
+ }
}
+ $x->round(@r);
}
- $x->round($a, $p, $r);
+
+ return $downgrade->new($x, @r) if defined($downgrade);
+ return $x;
}
sub bint {
# round towards zero
- my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1,
@_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bint');
- return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
- # if $x has digits after the decimal point
- if ($x->{_es} eq '-') {
- $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # cut off digits after
dot
- $x->{_e} = $LIB->_zero(); # truncate/normalize
- $x->{_es} = '+'; # abs e
- $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # avoid -0
+ if ($x->{sign} =~ /^[+-]$/) {
+ # if $x has digits after the decimal point
+ if ($x->{_es} eq '-') {
+ $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # remove fraction
part
+ $x->{_e} = $LIB->_zero(); #
truncate/normalize
+ $x->{_es} = '+'; # abs e
+ $x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # avoid -0
+ }
+ $x->round(@r);
}
- $x->round($a, $p, $r);
+
+ return $downgrade->new($x, @r) if defined($downgrade);
+ return $x;
}
###############################################################################
@@ -5234,7 +5351,7 @@
=head1 NAME
-Math::BigFloat - Arbitrary size floating point math package
+Math::BigFloat - arbitrary size floating point math package
=head1 SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/lib/Math/BigInt/Calc.pm
new/Math-BigInt-1.999830/lib/Math/BigInt/Calc.pm
--- old/Math-BigInt-1.999829/lib/Math/BigInt/Calc.pm 2021-12-29
19:28:36.000000000 +0100
+++ new/Math-BigInt-1.999830/lib/Math/BigInt/Calc.pm 2022-04-11
08:05:30.000000000 +0200
@@ -7,7 +7,8 @@
use Carp qw< carp croak >;
use Math::BigInt::Lib;
-our $VERSION = '1.999829';
+our $VERSION = '1.999830';
+$VERSION =~ tr/_//d;
our @ISA = ('Math::BigInt::Lib');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/lib/Math/BigInt/Lib.pm
new/Math-BigInt-1.999830/lib/Math/BigInt/Lib.pm
--- old/Math-BigInt-1.999829/lib/Math/BigInt/Lib.pm 2021-12-29
19:28:07.000000000 +0100
+++ new/Math-BigInt-1.999830/lib/Math/BigInt/Lib.pm 2022-04-11
08:05:29.000000000 +0200
@@ -4,7 +4,8 @@
use strict;
use warnings;
-our $VERSION = '1.999829';
+our $VERSION = '1.999830';
+$VERSION =~ tr/_//d;
use Carp;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/lib/Math/BigInt.pm
new/Math-BigInt-1.999830/lib/Math/BigInt.pm
--- old/Math-BigInt-1.999829/lib/Math/BigInt.pm 2021-12-30 17:36:05.000000000
+0100
+++ new/Math-BigInt-1.999830/lib/Math/BigInt.pm 2022-04-11 08:05:29.000000000
+0200
@@ -23,7 +23,8 @@
use Carp qw< carp croak >;
use Scalar::Util qw< blessed >;
-our $VERSION = '1.999829';
+our $VERSION = '1.999830';
+$VERSION =~ tr/_//d;
require Exporter;
our @ISA = qw(Exporter);
@@ -1642,6 +1643,7 @@
#}
sub badd {
+
# add second arg (BINT or string) to first (BINT) (modifies first)
# return result as BINT
@@ -1708,7 +1710,7 @@
return $x if $x -> modify('bsub');
- return $upgrade -> new($x) -> bsub($upgrade -> new($y), @r)
+ return $upgrade -> bsub($upgrade -> new($x), $upgrade -> new($y), @r)
if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class));
return $x -> round(@r) if $y -> is_zero();
@@ -2813,7 +2815,7 @@
return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
- return $upgrade->new($x)->bsin(@r) if defined $upgrade;
+ return $upgrade -> bsin($upgrade -> new($x, @r)) if defined $upgrade;
require Math::BigFloat;
# calculate the result and truncate it to integer
@@ -2833,11 +2835,11 @@
return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
- return $upgrade->new($x)->bcos(@r) if defined $upgrade;
+ return $upgrade -> bcos($upgrade -> new($x), @r) if defined $upgrade;
require Math::BigFloat;
# calculate the result and truncate it to integer
- my $t = Math::BigFloat->new($x)->bcos(@r)->as_int();
+ my $t = Math::BigFloat -> bcos(Math::BigFloat -> new($x), @r) -> as_int();
$x->bone() if $t->is_one();
$x->bzero() if $t->is_zero();
@@ -4186,10 +4188,10 @@
no strict 'refs';
- # What we upgrade to, if anything. Note that we need the whole chain of
- # upgrading, because we accept objects that go through multiple upgrades,
- # e.g., when Math::BigInt upgrades to Math::BigFloat which upgrades to
- # Math::BigRat. We delay getting the chain until we actually need it.
+ # What we upgrade to, if anything. Note that we need the whole upgrade
+ # chain, since there might be multiple levels of upgrading. E.g., class A
+ # upgrades to class B, which upgrades to class C. Delay getting the chain
+ # until we actually need it.
my @upg = ();
my $have_upgrade_chain = 0;
@@ -4218,12 +4220,14 @@
next if $ref -> isa($a[0]);
- # Upgrading is OK, so skip further tests if the argument is upgraded.
+ # Upgrading is OK, so skip further tests if the argument is upgraded,
+ # but first get the whole upgrade chain if we haven't got it yet.
unless ($have_upgrade_chain) {
my $cls = $class;
my $upg = $cls -> upgrade();
while (defined $upg) {
+ last if $upg eq $cls;
push @upg, $upg;
$cls = $upg;
$upg = $cls -> upgrade();
@@ -5319,7 +5323,7 @@
=head1 NAME
-Math::BigInt - Arbitrary size integer/float math package
+Math::BigInt - arbitrary size integer math package
=head1 SYNOPSIS
@@ -5727,18 +5731,25 @@
Set/get the class for upgrading. When a computation might result in a
non-integer, the operands are upgraded to this class. This is used for instance
-by L<bignum>. The default is C<undef>, thus the following operation creates
-a Math::BigInt, not a Math::BigFloat:
-
- my $i = Math::BigInt->new(123);
- my $f = Math::BigFloat->new('123.1');
+by L<bignum>. The default is C<undef>, i.e., no upgrading.
- print $i + $f, "\n"; # prints 246
+ # with no upgrading
+ $x = Math::BigInt->new(12);
+ $y = Math::BigInt->new(5);
+ print $x / $y, "\n"; # 2 as a Math::BigInt
+
+ # with upgrading to Math::BigFloat
+ Math::BigInt -> upgrade("Math::BigFloat");
+ print $x / $y, "\n"; # 2.4 as a Math::BigFloat
+
+ # with upgrading to Math::BigRat (after loading Math::BigRat)
+ Math::BigInt -> upgrade("Math::BigRat");
+ print $x / $y, "\n"; # 12/5 as a Math::BigRat
=item downgrade()
-Set/get the class for downgrading. The default is C<undef>. Downgrading is not
-done by Math::BigInt.
+Set/get the class for downgrading. The default is C<undef>, i.e., no
+downgrading. Downgrading is not done by Math::BigInt.
=item modify()
@@ -5796,8 +5807,8 @@
$x = Math::BigInt->new($str,$A,$P,$R);
Creates a new Math::BigInt object from a scalar or another Math::BigInt object.
-The input is accepted as decimal, hexadecimal (with leading '0x') or binary
-(with leading '0b').
+The input is accepted as decimal, hexadecimal (with leading '0x'), octal (with
+leading ('0o') or binary (with leading '0b').
See L</Input> for more info on accepted input formats.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/t/downgrade.t
new/Math-BigInt-1.999830/t/downgrade.t
--- old/Math-BigInt-1.999829/t/downgrade.t 2021-12-28 20:17:36.000000000
+0100
+++ new/Math-BigInt-1.999830/t/downgrade.t 2022-04-11 08:04:29.000000000
+0200
@@ -1,40 +1,18 @@
# -*- mode: perl; -*-
+# Note that this does not test Math::BigFloat upgrading.
+
use strict;
use warnings;
-use Test::More tests => 15;
+use Test::More tests => 164;
use Math::BigInt upgrade => 'Math::BigFloat';
-use Math::BigFloat downgrade => 'Math::BigInt',
- upgrade => 'Math::BigInt';
-
-our ($CLASS, $EXPECTED_CLASS, $LIB);
-$CLASS = "Math::BigInt";
-$EXPECTED_CLASS = "Math::BigFloat";
-$LIB = "Math::BigInt::Calc"; # backend
+use Math::BigFloat downgrade => 'Math::BigInt';
# simplistic test for now
is(Math::BigFloat->downgrade(), 'Math::BigInt', 'Math::BigFloat->downgrade()');
-is(Math::BigFloat->upgrade(), 'Math::BigInt', 'Math::BigFloat->upgrade()');
-
-# these downgrade
-is(ref(Math::BigFloat->new("inf")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("inf"))|);
-is(ref(Math::BigFloat->new("-inf")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("-inf"))|);
-is(ref(Math::BigFloat->new("NaN")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("NaN"))|);
-is(ref(Math::BigFloat->new("0")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("0"))|);
-is(ref(Math::BigFloat->new("1")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("1"))|);
-is(ref(Math::BigFloat->new("10")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("10"))|);
-is(ref(Math::BigFloat->new("-10")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("-10"))|);
-is(ref(Math::BigFloat->new("-10.0E1")), "Math::BigInt",
- qq|ref(Math::BigFloat->new("-10.0E1"))|);
+is(Math::BigInt->upgrade(), 'Math::BigFloat', 'Math::BigInt->upgrade()');
# bug until v1.67:
is(Math::BigFloat->new("0.2E0"), "0.2", qq|Math::BigFloat->new("0.2E0")|);
@@ -53,4 +31,462 @@
is(Math::BigFloat->bpow("2", "0.5"), $x->bsqrt(),
qq|Math::BigFloat->bpow("2", "0.5")|);
+################################################################################
+# Verify that constructors downgrade when they should.
+
+note("Enable downgrading, and see if constructors downgrade");
+
+Math::BigFloat -> downgrade("Math::BigInt");
+
+# new()
+
+$x = Math::BigFloat -> new("0.5");
+cmp_ok($x, "==", 0.5);
+is(ref $x, "Math::BigFloat", "Creating a 0.5 does not downgrade");
+
+$x = Math::BigFloat -> new("4");
+cmp_ok($x, "==", 4, 'new("4")');
+is(ref $x, "Math::BigInt", "Creating a 4 downgrades to Math::BigInt");
+
+$x = Math::BigFloat -> new("0");
+cmp_ok($x, "==", 0, 'new("0")');
+is(ref $x, "Math::BigInt", "Creating a 0 downgrades to Math::BigInt");
+
+$x = Math::BigFloat -> new("1");
+cmp_ok($x, "==", 1, 'new("1")');
+is(ref $x, "Math::BigInt", "Creating a 1 downgrades to Math::BigInt");
+
+$x = Math::BigFloat -> new("Inf");
+cmp_ok($x, "==", "Inf", 'new("inf")');
+is(ref $x, "Math::BigInt", "Creating an Inf downgrades to Math::BigInt");
+
+$x = Math::BigFloat -> new("NaN");
+is($x, "NaN", 'new("NaN")');
+is(ref $x, "Math::BigInt", "Creating a NaN downgrades to Math::BigInt");
+
+# bzero()
+
+$x = Math::BigFloat -> bzero();
+cmp_ok($x, "==", 0, "bzero()");
+is(ref $x, "Math::BigInt", "Creating a 0 downgrades to Math::BigInt");
+
+# bone()
+
+$x = Math::BigFloat -> bone();
+cmp_ok($x, "==", 1, "bone()");
+is(ref $x, "Math::BigInt", "Creating a 1 downgrades to Math::BigInt");
+
+# binf()
+
+$x = Math::BigFloat -> binf();
+cmp_ok($x, "==", "Inf", "binf()");
+is(ref $x, "Math::BigInt", "Creating an Inf downgrades to Math::BigInt");
+
+# bnan()
+
+$x = Math::BigFloat -> bnan();
+is($x, "NaN", "bnan()");
+is(ref $x, "Math::BigInt", "Creating a NaN downgrades to Math::BigInt");
+
+# from_dec()
+
+$x = Math::BigFloat -> from_dec("3.14e2");
+cmp_ok($x, "==", 314, 'from_dec("3.14e2")');
+is(ref $x, "Math::BigInt", 'from_dec("3.14e2") downgrades to Math::BigInt');
+
+# from_hex()
+
+$x = Math::BigFloat -> from_hex("0x1.3ap+8");
+cmp_ok($x, "==", 314, 'from_hex("3.14e2")');
+is(ref $x, "Math::BigInt", 'from_hex("3.14e2") downgrades to Math::BigInt');
+
+# from_oct()
+
+$x = Math::BigFloat -> from_oct("0o1.164p+8");
+cmp_ok($x, "==", 314, 'from_oct("0o1.164p+8")');
+is(ref $x, "Math::BigInt", 'from_oct("0o1.164p+8") downgrades to
Math::BigInt');
+
+# from_bin()
+
+$x = Math::BigFloat -> from_bin("0b1.0011101p+8");
+cmp_ok($x, "==", 314, 'from_bin("0b1.0011101p+8")');
+is(ref $x, "Math::BigInt",
+ 'from_bin("0b1.0011101p+8") downgrades to Math::BigInt');
+
+# from_ieee754()
+
+$x = Math::BigFloat -> from_ieee754("\x43\x9d\x00\x00", "binary32");
+cmp_ok($x, "==", 314, 'from_ieee754("\x43\x9d\x00\x00", "binary32")');
+is(ref $x, "Math::BigInt",
+ 'from_ieee754("\x43\x9d\x00\x00", "binary32") downgrades to Math::BigInt');
+
+note("Disable downgrading, and see if constructors downgrade");
+
+Math::BigFloat -> downgrade(undef);
+
+my $half = Math::BigFloat -> new("0.5");
+my $four = Math::BigFloat -> new("4");
+my $zero = Math::BigFloat -> bzero();
+my $inf = Math::BigFloat -> binf();
+my $nan = Math::BigFloat -> bnan();
+
+is(ref $half, "Math::BigFloat", "Creating a 0.5 does not downgrade");
+is(ref $four, "Math::BigFloat", "Creating a 4 does not downgrade");
+is(ref $zero, "Math::BigFloat", "Creating a 0 does not downgrade");
+is(ref $inf, "Math::BigFloat", "Creating an Inf does not downgrade");
+is(ref $nan, "Math::BigFloat", "Creating a NaN does not downgrade");
+
+################################################################################
+# Verify that other methods downgrade when they should.
+
+Math::BigFloat -> downgrade("Math::BigInt");
+
+# This shouldn't be necessary, but it is. Fixme!
+
+Math::BigInt -> upgrade(undef);
+
+# bneg()
+
+$x = $zero -> copy() -> bneg();
+cmp_ok($x, "==", 0, "-(0) = 0");
+is(ref($x), "Math::BigInt", "-(0) => Math::BigInt");
+
+$x = $four -> copy() -> bneg();
+cmp_ok($x, "==", -4, "-(4) = -4");
+is(ref($x), "Math::BigInt", "-(4) => Math::BigInt");
+
+$x = $inf -> copy() -> bneg();
+cmp_ok($x, "==", "-inf", "-(Inf) = -Inf");
+is(ref($x), "Math::BigInt", "-(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bneg();
+is($x, "NaN", "-(NaN) = NaN");
+is(ref($x), "Math::BigInt", "-(NaN) => Math::BigInt");
+
+# bnorm()
+
+$x = $zero -> copy() -> bnorm();
+cmp_ok($x, "==", 0, "bnorm(0)");
+is(ref($x), "Math::BigInt", "bnorm(0) => Math::BigInt");
+
+$x = $four -> copy() -> bnorm();
+cmp_ok($x, "==", 4, "bnorm(4)");
+is(ref($x), "Math::BigInt", "bnorm(4) => Math::BigInt");
+
+$x = $inf -> copy() -> bnorm();
+cmp_ok($x, "==", "inf", "bnorm(Inf)");
+is(ref($x), "Math::BigInt", "bnorm(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bnorm();
+is($x, "NaN", "bnorm(NaN)");
+is(ref($x), "Math::BigInt", "bnorm(NaN) => Math::BigInt");
+
+# binc()
+
+$x = $zero -> copy() -> binc();
+cmp_ok($x, "==", 1, "binc(0)");
+is(ref($x), "Math::BigInt", "binc(0) => Math::BigInt");
+
+$x = $four -> copy() -> binc();
+cmp_ok($x, "==", 5, "binc(4)");
+is(ref($x), "Math::BigInt", "binc(4) => Math::BigInt");
+
+$x = $inf -> copy() -> binc();
+cmp_ok($x, "==", "inf", "binc(Inf)");
+is(ref($x), "Math::BigInt", "binc(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> binc();
+is($x, "NaN", "binc(NaN)");
+is(ref($x), "Math::BigInt", "binc(NaN) => Math::BigInt");
+
+# bdec()
+
+$x = $zero -> copy() -> bdec();
+cmp_ok($x, "==", -1, "bdec(0)");
+is(ref($x), "Math::BigInt", "bdec(0) => Math::BigInt");
+
+$x = $four -> copy() -> bdec();
+cmp_ok($x, "==", 3, "bdec(4)");
+is(ref($x), "Math::BigInt", "bdec(4) => Math::BigInt");
+
+$x = $inf -> copy() -> bdec();
+cmp_ok($x, "==", "inf", "bdec(Inf)");
+is(ref($x), "Math::BigInt", "bdec(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bdec();
+is($x, "NaN", "bdec(NaN)");
+is(ref($x), "Math::BigInt", "bdec(NaN) => Math::BigInt");
+
+# badd()
+
+$x = $half -> copy() -> badd($nan);
+is($x, "NaN", "0.5 + NaN = NaN");
+is(ref($x), "Math::BigInt", "0.5 + NaN => Math::BigInt");
+
+$x = $half -> copy() -> badd($inf);
+cmp_ok($x, "==", "+Inf", "0.5 + Inf = Inf");
+is(ref($x), "Math::BigInt", "2.5 + Inf => Math::BigInt");
+
+$x = $half -> copy() -> badd($half);
+cmp_ok($x, "==", 1, "0.5 + 0.5 = 1");
+is(ref($x), "Math::BigInt", "0.5 + 0.5 => Math::BigInt");
+
+$x = $half -> copy() -> badd($half -> copy() -> bneg());
+cmp_ok($x, "==", 0, "0.5 + -0.5 = 0");
+is(ref($x), "Math::BigInt", "0.5 + -0.5 => Math::BigInt");
+
+$x = $four -> copy() -> badd($zero);
+cmp_ok($x, "==", 4, "4 + 0 = 4");
+is(ref($x), "Math::BigInt", "4 + 0 => Math::BigInt");
+
+$x = $zero -> copy() -> badd($four);
+cmp_ok($x, "==", 4, "0 + 4 = 4");
+is(ref($x), "Math::BigInt", "0 + 4 => Math::BigInt");
+
+$x = $inf -> copy() -> badd($four);
+cmp_ok($x, "==", "+Inf", "Inf + 4 = Inf");
+is(ref($x), "Math::BigInt", "Inf + 4 => Math::BigInt");
+
+$x = $nan -> copy() -> badd($four);
+is($x, "NaN", "NaN + 4 = NaN");
+is(ref($x), "Math::BigInt", "NaN + 4 => Math::BigInt");
+
+# bsub()
+
+$x = $half -> copy() -> bsub($nan);
+is($x, "NaN", "0.5 - NaN = NaN");
+is(ref($x), "Math::BigInt", "0.5 - NaN => Math::BigInt");
+
+$x = $half -> copy() -> bsub($inf);
+cmp_ok($x, "==", "-Inf", "2.5 - Inf = -Inf");
+is(ref($x), "Math::BigInt", "2.5 - Inf => Math::BigInt");
+
+$x = $half -> copy() -> bsub($half);
+cmp_ok($x, "==", 0, "0.5 + 0.5 = 0");
+is(ref($x), "Math::BigInt", "0.5 - 0.5 => Math::BigInt");
+
+$x = $half -> copy() -> bsub($half -> copy() -> bneg());
+cmp_ok($x, "==", 1, "0.5 - -0.5 = 1");
+is(ref($x), "Math::BigInt", "0.5 - -0.5 => Math::BigInt");
+
+$x = $four -> copy() -> bsub($zero);
+cmp_ok($x, "==", 4, "4 - 0 = 4");
+is(ref($x), "Math::BigInt", "4 - 0 => Math::BigInt");
+
+$x = $zero -> copy() -> bsub($four);
+cmp_ok($x, "==", -4, "0 - 4 = -4");
+is(ref($x), "Math::BigInt", "0 - 4 => Math::BigInt");
+
+$x = $inf -> copy() -> bsub($four);
+cmp_ok($x, "==", "Inf", "Inf - 4 = Inf");
+is(ref($x), "Math::BigInt", "Inf - 4 => Math::BigInt");
+
+$x = $nan -> copy() -> bsub($four);
+is($x, "NaN", "NaN - 4 = NaN");
+is(ref($x), "Math::BigInt", "NaN - 4 => Math::BigInt");
+
+# bmul()
+
+$x = $zero -> copy() -> bmul($four);
+cmp_ok($x, "==", 0, "bmul(0, 4) = 0");
+is(ref($x), "Math::BigInt", "bmul(0, 4) => Math::BigInt");
+
+$x = $four -> copy() -> bmul($four);
+cmp_ok($x, "==", 16, "bmul(4, 4) = 16");
+is(ref($x), "Math::BigInt", "bmul(4, 4) => Math::BigInt");
+
+$x = $inf -> copy() -> bmul($four);
+cmp_ok($x, "==", "inf", "bmul(Inf, 4) = Inf");
+is(ref($x), "Math::BigInt", "bmul(Inf, 4) => Math::BigInt");
+
+$x = $nan -> copy() -> bmul($four);
+is($x, "NaN", "bmul(NaN, 4) = NaN");
+is(ref($x), "Math::BigInt", "bmul(NaN, 4) => Math::BigInt");
+
+$x = $four -> copy() -> bmul("0.5");
+cmp_ok($x, "==", 2, "bmul(4, 0.5) = 2");
+is(ref($x), "Math::BigInt", "bmul(4, 0.5) => Math::BigInt");
+
+# bmuladd()
+
+$x = $zero -> copy() -> bmuladd($four, $four);
+cmp_ok($x, "==", 4, "bmuladd(0, 4, 4) = 4");
+is(ref($x), "Math::BigInt", "bmuladd(0, 4, 4) => Math::BigInt");
+
+$x = $four -> copy() -> bmuladd($four, $four);
+cmp_ok($x, "==", 20, "bmuladd(4, 4, 4) = 20");
+is(ref($x), "Math::BigInt", "bmuladd(4, 4, 4) => Math::BigInt");
+
+$x = $four -> copy() -> bmuladd($four, $inf);
+cmp_ok($x, "==", "inf", "bmuladd(4, 4, Inf) = Inf");
+is(ref($x), "Math::BigInt", "bmuladd(4, 4, Inf) => Math::BigInt");
+
+$x = $inf -> copy() -> bmuladd($four, $four);
+cmp_ok($x, "==", "inf", "bmuladd(Inf, 4, 4) = Inf");
+is(ref($x), "Math::BigInt", "bmuladd(Inf, 4, 4) => Math::BigInt");
+
+$x = $inf -> copy() -> bmuladd($four, $four);
+cmp_ok($x, "==", "inf", "bmuladd(Inf, 4, 4) = Inf");
+is(ref($x), "Math::BigInt", "bmuladd(Inf, 4, 4) => Math::BigInt");
+
+$x = $nan -> copy() -> bmuladd($four, $four);
+is($x, "NaN", "bmuladd(NaN, 4, 4) = NaN");
+is(ref($x), "Math::BigInt", "bmuladd(NaN, 4, 4) => Math::BigInt");
+
+$x = $four -> copy() -> bmuladd("0.5", $four);
+cmp_ok($x, "==", 6, "bmuladd(4, 0.5, 4) = 6");
+is(ref($x), "Math::BigInt", "bmuladd(4, 0.5, 4) => Math::BigInt");
+
+# bdiv()
+
+# bmod()
+
+# bmodpow()
+
+# bpow()
+
+# blog()
+
+# bexp()
+
+# bnok()
+
+# bsin()
+
+# bcos()
+
+# batan()
+
+# batan()
+
+# bsqrt()
+
+# broot()
+
+# bfac()
+
+# bdfac()
+
+# btfac()
+
+# bmfac()
+
+# blsft()
+
+# brsft()
+
+# band()
+
+# bior()
+
+# bxor()
+
+# bnot()
+
+# bround()
+
+# Add tests for rounding a non-integer to an integer. Fixme!
+
+$x = $zero -> copy() -> bround();
+cmp_ok($x, "==", 0, "bround(0)");
+is(ref($x), "Math::BigInt", "bround(0) => Math::BigInt");
+
+$x = $four -> copy() -> bround();
+cmp_ok($x, "==", 4, "bround(4)");
+is(ref($x), "Math::BigInt", "bround(4) => Math::BigInt");
+
+$x = $inf -> copy() -> bround();
+cmp_ok($x, "==", "inf", "bround(Inf)");
+is(ref($x), "Math::BigInt", "bround(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bround();
+is($x, "NaN", "bround(NaN)");
+is(ref($x), "Math::BigInt", "bround(NaN) => Math::BigInt");
+
+# bfround()
+
+# Add tests for rounding a non-integer to an integer. Fixme!
+
+$x = $zero -> copy() -> bfround();
+cmp_ok($x, "==", 0, "bfround(0)");
+is(ref($x), "Math::BigInt", "bfround(0) => Math::BigInt");
+
+$x = $four -> copy() -> bfround();
+cmp_ok($x, "==", 4, "bfround(4)");
+is(ref($x), "Math::BigInt", "bfround(4) => Math::BigInt");
+
+$x = $inf -> copy() -> bfround();
+cmp_ok($x, "==", "inf", "bfround(Inf)");
+is(ref($x), "Math::BigInt", "bfround(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bfround();
+is($x, "NaN", "bfround(NaN)");
+is(ref($x), "Math::BigInt", "bfround(NaN) => Math::BigInt");
+
+# bfloor()
+
+$x = $half -> copy() -> bfloor();
+cmp_ok($x, "==", 0, "bfloor(0)");
+is(ref($x), "Math::BigInt", "bfloor(0) => Math::BigInt");
+
+$x = $inf -> copy() -> bfloor();
+cmp_ok($x, "==", "Inf", "bfloor(Inf)");
+is(ref($x), "Math::BigInt", "bfloor(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bfloor();
+is($x, "NaN", "bfloor(NaN)");
+is(ref($x), "Math::BigInt", "bfloor(NaN) => Math::BigInt");
+
+# bceil()
+
+$x = $half -> copy() -> bceil();
+cmp_ok($x, "==", 1, "bceil(0)");
+is(ref($x), "Math::BigInt", "bceil(0) => Math::BigInt");
+
+$x = $inf -> copy() -> bceil();
+cmp_ok($x, "==", "Inf", "bceil(Inf)");
+is(ref($x), "Math::BigInt", "bceil(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bceil();
+is($x, "NaN", "bceil(NaN)");
+is(ref($x), "Math::BigInt", "bceil(NaN) => Math::BigInt");
+
+# bint()
+
+$x = $half -> copy() -> bint();
+cmp_ok($x, "==", 0, "bint(0)");
+is(ref($x), "Math::BigInt", "bint(0) => Math::BigInt");
+
+$x = $inf -> copy() -> bint();
+cmp_ok($x, "==", "Inf", "bint(Inf)");
+is(ref($x), "Math::BigInt", "bint(Inf) => Math::BigInt");
+
+$x = $nan -> copy() -> bint();
+is($x, "NaN", "bint(NaN)");
+is(ref($x), "Math::BigInt", "bint(NaN) => Math::BigInt");
+
+# bgcd()
+
+# blcm()
+
+# mantissa() ?
+
+# exponent() ?
+
+# parts() ?
+
+# sparts()
+
+# nparts()
+
+# eparts()
+
+# dparts()
+
+# fparts()
+
+# numerator()
+
+# denominator()
+
#require 'upgrade.inc'; # all tests here for sharing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/t/upgrade.t
new/Math-BigInt-1.999830/t/upgrade.t
--- old/Math-BigInt-1.999829/t/upgrade.t 2021-12-28 20:17:36.000000000
+0100
+++ new/Math-BigInt-1.999830/t/upgrade.t 2022-04-11 08:04:29.000000000
+0200
@@ -4,11 +4,29 @@
use warnings;
use Test::More tests => 2134 # tests in require'd file
- + 2; # tests in this file
+ + 6; # tests in this file
-use Math::BigInt upgrade => 'Math::BigFloat';
+use Math::BigInt;
use Math::BigFloat;
+my $x = Math::BigInt -> new(9);
+my $y = Math::BigInt -> new(4);
+
+# Without upgrading.
+
+my $zi = $x / $y;
+cmp_ok($zi, "==", 2, "9/4 = 2 without upgrading");
+is(ref($zi), "Math::BigInt", "9/4 gives a Math::BigInt without upgrading");
+
+# With upgrading.
+
+Math::BigInt -> upgrade("Math::BigFloat");
+my $zf = $x / $y;
+cmp_ok($zf, "==", 2.25, "9/4 = 2.25 with upgrading");
+is(ref($zf), "Math::BigFloat", "9/4 gives a Math::BigFloat with upgrading");
+
+# Other tests.
+
our ($CLASS, $EXPECTED_CLASS, $LIB);
$CLASS = "Math::BigInt";
$EXPECTED_CLASS = "Math::BigFloat";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Math-BigInt-1.999829/xt/release/git.t
new/Math-BigInt-1.999830/xt/release/git.t
--- old/Math-BigInt-1.999829/xt/release/git.t 2021-12-28 20:17:37.000000000
+0100
+++ new/Math-BigInt-1.999830/xt/release/git.t 2022-04-11 08:04:29.000000000
+0200
@@ -132,7 +132,7 @@
while (defined(my $line = <$fh>)) {
if ($line =~ /^(\S+)/) {
my $verstr = $1;
- if ($verstr =~ / ^ v? ( \d+ ( \. \d+ )? ) $ /ix) {
+ if ($verstr =~ / ^ v? ( \d+ ( \. \d+ ( _ \d+ )* )? ) $ /ix) {
my $vernum = $1;
$vernum =~ tr/_//d;
push @vers, [ $verstr, $vernum ];
@@ -171,7 +171,7 @@
$pipe -> reader(@args);
while (defined(my $tag = <$pipe>)) {
$tag =~ s/\s+\z//;
- if ($tag =~ / ^ v? ( \d+ ( \. \d+ )? ) /ix) {
+ if ($tag =~ / ^ v? ( \d+ ( \. \d+ ( _ \d+ )* )? ) /ix) {
my $vernum = $1;
$vernum =~ tr/_//d;
push @tags, [ $tag, $vernum ];