[perl #95530] BigRat int(-1/2) == 0
authorFather Chrysostomos <sprout@cpan.org>
Mon, 22 Aug 2011 20:43:59 +0000 (13:43 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 22 Aug 2011 20:44:28 +0000 (13:44 -0700)
Math::BigRat was trying to copy the sign of a BigRat object into a
BigInt object when converting to an integer, but without taking into
account that the number might be rounded toward zero.  This resulted
in a 0 BigInt with a negative sign, which is not actually a valid
BigInt object, as it does not support negative zero.

dist/Math-BigRat/lib/Math/BigRat.pm
dist/Math-BigRat/t/bigrat.t
pod/perldelta.pod

index 31c85fd..eb07e82 100644 (file)
@@ -24,7 +24,7 @@ use vars qw($VERSION @ISA $upgrade $downgrade
 
 @ISA = qw(Math::BigFloat);
 
-$VERSION = '0.2602';
+$VERSION = '0.2603';
 $VERSION = eval $VERSION;
 
 # inherit overload from Math::BigFloat, but disable the bitwise ops that don't
@@ -1428,8 +1428,8 @@ sub as_number
   return Math::BigInt->new($x->{sign}) if $x->{sign} !~ /^[+-]$/;
 
   my $u = Math::BigInt->bzero();
-  $u->{sign} = $x->{sign};
   $u->{value} = $MBI->_div( $MBI->_copy($x->{_n}), $x->{_d});  # 22/7 => 3
+  $u->bneg if $x->{sign} eq '-'; # no negative zero
   $u;
   }
 
index b900ffa..a640e59 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
-use Test::More tests => 200;
+use Test::More tests => 202;
 
 # basic testing of Math::BigRat
 
@@ -319,6 +319,14 @@ is ($x, '2/3', '$x unmodified');
 is ($f, '0.66667', 'as_float(2/3,5)');
 
 ##############################################################################
+# int()
+
+$x  = Math::BigRat->new('5/2');
+is int($x), '2', '5/2 converted to integer';
+$x  = Math::BigRat->new('-1/2');
+is int($x), '0', '-1/2 converted to integer';
+
+##############################################################################
 # done
 
 1;
index fbc2535..86e179d 100644 (file)
@@ -110,6 +110,15 @@ L<Archive::Extract> has been upgraded from version 0.52 to version 0.54
 
 Resolved an issue where C<unzip> executable was present in C<PATH> on MSWin32
 
+=item *
+
+L<Math::BigRat> has been upgraded from version 0.2602 to 0.2603.
+
+C<int()> on a Math::BigRat object containing -1/2 now creates a
+Math::BigInt containing 0, rather than -0.  L<Math::BigInt> does not even
+support negative zero, so the resulting object was actually malformed
+[perl #95530].
+
 =back
 
 =head2 Removed Modules and Pragmata