Math::BigRat 0.22
[p5sagit/p5-mst-13.2.git] / lib / Math / BigFloat.pm
index 7fb9863..6e1ecc8 100644 (file)
@@ -12,8 +12,8 @@ package Math::BigFloat;
 #   _a : accuracy
 #   _p : precision
 
-$VERSION = '1.58';
-require 5.006002;
+$VERSION = '1.59';
+require 5.006;
 
 require Exporter;
 @ISA           = qw/Math::BigInt/;
@@ -2381,7 +2381,6 @@ sub bpow
     }
   if ($x_is_zero)
     {
-    #return $x->bone() if $y_is_zero;
     return $x if $y->{sign} eq '+';    # 0**y => 0 (if not y <= 0)
     # 0 ** -y => 1 / (0 ** y) => 1 / 0! (1 / 0 => +inf)
     return $x->binf();
@@ -2588,6 +2587,7 @@ sub bpi
     $n = undef if $n eq 'Math::BigFloat';
     }
   $self = ref($self) if ref($self);
+  my $fallback = defined $n ? 0 : 1;
   $n = 40 if !defined $n || $n < 1;
 
   # after 黃見利 (Hwang Chien-Lih) (1997)
@@ -2624,11 +2624,13 @@ sub bpi
   $v->bdiv($v_d, $n);
   $w->bdiv($w_d, $n);
 
-  delete $x->{a}; delete $y->{a}; delete $z->{a};
-  delete $u->{a}; delete $v->{a}; delete $w->{a};
+  delete $x->{_a}; delete $y->{_a}; delete $z->{_a};
+  delete $u->{_a}; delete $v->{_a}; delete $w->{_a};
   $x->badd($y)->bsub($z)->badd($u)->bsub($v)->bsub($w);
 
-  $x->round($n-4);
+  $x->bround($n-4);
+  delete $x->{_a} if $fallback == 1;
+  $x;
   }
 
 sub bcos
@@ -2683,7 +2685,7 @@ sub bcos
   my $x2 = $over->copy();               # X ^ 2; difference between terms
   my $sign = 1;                         # start with -=
   my $below = $self->new(2); my $factorial = $self->new(3);
-  $x->bone(); delete $x->{a}; delete $x->{p};
+  $x->bone(); delete $x->{_a}; delete $x->{_p};
 
   my $limit = $self->new("1E-". ($scale-1));
   #my $steps = 0;
@@ -2782,7 +2784,7 @@ sub bsin
   $over->bmul($x);                     # X ^ 3 as starting value
   my $sign = 1;                                # start with -=
   my $below = $self->new(6); my $factorial = $self->new(4);
-  delete $x->{a}; delete $x->{p};
+  delete $x->{_a}; delete $x->{_p};
 
   my $limit = $self->new("1E-". ($scale-1));
   #my $steps = 0;
@@ -3033,7 +3035,7 @@ sub batan
     }
   
   # This series is only valid if -1 < x < 1, so for other x we need to
-  # to calculate PI/ - atan(1/x):
+  # to calculate PI/2 - atan(1/x):
   my $one = $MBI->_new(1);
   my $pi = undef;
   if ($x->{_es} eq '+' && ($MBI->_acmp($x->{_m},$one) >= 0))
@@ -3065,7 +3067,7 @@ sub batan
   my $sign = 1;                                # start with -=
   my $below = $self->new(3);
   my $two = $self->new(2);
-  delete $x->{a}; delete $x->{p};
+  delete $x->{_a}; delete $x->{_p};
 
   my $limit = $self->new("1E-". ($scale-1));
   #my $steps = 0;