Subject: | [PATCH] atan2 returns incorrect results |
Ambrus at perlmonks noticed that:
$ perl -e'use bignum; print atan2(0,1)'
prints the value of pi/2, which is incorrect. This seems to occur for all recent versions. I haven't tested any old ones.
I found that lib/Math/BigInt.pm overloads atan2, but does not pay attention to the argument order flag.
Attached is a patch to lib/Math/BigInt.pm, as well as to t/fallback.t. The test patch implements tests which will catch this problem.
The patched version builds and passes all tests. Installed, it fixes the problem ambrus found.
Regards,
Zaxo
--- Math-BigInt-1.74/lib/Math/BigInt.pm Sat Jan 1 10:57:35 2005
+++ Math-BigInt-1.74_1/lib/Math/BigInt.pm Sun Jan 23 23:33:26 2005
@@ -75,7 +75,9 @@
'cos' => sub { cos($_[0]->numify()) },
'sin' => sub { sin($_[0]->numify()) },
'exp' => sub { exp($_[0]->numify()) },
-'atan2' => sub { atan2($_[0]->numify(),$_[1]) },
+'atan2' => sub { $_[2] ?
+ atan2($_[1],$_[0]->numify()) :
+ atan2($_[0]->numify(),$_[1]) },
# are not yet overloadable
#'hex' => sub { print "hex"; $_[0]; },
--- Math-BigInt-1.74/t/fallback.t Thu Dec 11 14:17:58 2003
+++ Math-BigInt-1.74_1/t/fallback.t Sun Jan 23 22:36:17 2005
@@ -28,7 +28,7 @@
}
print "# INC = @INC\n";
- plan tests => 8;
+ plan tests => 9;
}
# The tests below test that cos(BigInt) = cos(Scalar) which is DWIM, but not
@@ -46,10 +46,11 @@
ok (exp($bi), exp(1));
ok (atan2($bi,$bi), atan2(1,1));
-my $bf = Math::BigInt->new(1);
+my $bf = Math::BigInt->new(0);
-ok (cos($bf), cos(1));
-ok (sin($bf), sin(1));
-ok (exp($bf), exp(1));
-ok (atan2($bf,$bf), atan2(1,1));
+ok (cos($bf), cos(0));
+ok (sin($bf), sin(0));
+ok (exp($bf), exp(0));
+ok (atan2($bi,$bf), atan2(1,0));
+ok (atan2($bf,$bi), atan2(0,1));