1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* math.c (math_atan2): change the behavior when x and y are zero.

* test/ruby/test_math.rb (test_atan2): add tests for the above
  changes.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29115 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mrkn 2010-08-27 03:51:56 +00:00
parent f64358db7d
commit 9be503f332
3 changed files with 18 additions and 2 deletions

View file

@ -1,3 +1,10 @@
Fri Aug 27 12:47:44 2010 Kenta Murata <mrkn@mrkn.jp>
* math.c (math_atan2): change the behavior when x and y are zero.
* test/ruby/test_math.rb (test_atan2): add tests for the above
changes.
Fri Aug 27 12:26:23 2010 NAKAMURA Usaku <usa@ruby-lang.org> Fri Aug 27 12:26:23 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* object.c (rb_obj_class): remove mention of obsolete method. * object.c (rb_obj_class): remove mention of obsolete method.

8
math.c
View file

@ -55,7 +55,13 @@ math_atan2(VALUE obj, VALUE y, VALUE x)
Need_Float2(y, x); Need_Float2(y, x);
dx = RFLOAT_VALUE(x); dx = RFLOAT_VALUE(x);
dy = RFLOAT_VALUE(y); dy = RFLOAT_VALUE(y);
if (dx == 0.0 && dy == 0.0) domain_error("atan2"); if (dx == 0.0 && dy == 0.0) {
if (!signbit(dx))
return DBL2NUM(dy);
if (!signbit(dy))
return DBL2NUM(M_PI);
return DBL2NUM(-M_PI);
}
if (isinf(dx) && isinf(dy)) domain_error("atan2"); if (isinf(dx) && isinf(dy)) domain_error("atan2");
return DBL2NUM(atan2(dy, dx)); return DBL2NUM(atan2(dy, dx));
} }

View file

@ -17,7 +17,10 @@ class TestMath < Test::Unit::TestCase
end end
def test_atan2 def test_atan2
assert_raise(Math::DomainError) { Math.atan2(0, 0) } check(+0.0, Math.atan2(+0.0, +0.0))
check(-0.0, Math.atan2(-0.0, +0.0))
check(+Math::PI, Math.atan2(+0.0, -0.0))
check(-Math::PI, Math.atan2(-0.0, -0.0))
assert_raise(Math::DomainError) { Math.atan2(Float::INFINITY, Float::INFINITY) } assert_raise(Math::DomainError) { Math.atan2(Float::INFINITY, Float::INFINITY) }
assert_raise(Math::DomainError) { Math.atan2(Float::INFINITY, -Float::INFINITY) } assert_raise(Math::DomainError) { Math.atan2(Float::INFINITY, -Float::INFINITY) }
assert_raise(Math::DomainError) { Math.atan2(-Float::INFINITY, Float::INFINITY) } assert_raise(Math::DomainError) { Math.atan2(-Float::INFINITY, Float::INFINITY) }