From c181d1e7fa80b1cc0551f8fbd85ab6f7419b7887 Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Thu, 8 Aug 2019 23:59:25 -0400 Subject: Implement Complex#abs in terms of Math.hypot Math.hypot avoids premature overflow and underflow --- mrbgems/mruby-complex/mrblib/complex.rb | 2 +- mrbgems/mruby-complex/test/complex.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'mrbgems/mruby-complex') diff --git a/mrbgems/mruby-complex/mrblib/complex.rb b/mrbgems/mruby-complex/mrblib/complex.rb index 1a6f7e92e..1025e975e 100644 --- a/mrbgems/mruby-complex/mrblib/complex.rb +++ b/mrbgems/mruby-complex/mrblib/complex.rb @@ -62,7 +62,7 @@ class Complex < Numeric end def abs - Math.sqrt(abs2) + Math.hypot imaginary, real end alias_method :magnitude, :abs diff --git a/mrbgems/mruby-complex/test/complex.rb b/mrbgems/mruby-complex/test/complex.rb index 4ae80515b..dcc0f3bef 100644 --- a/mrbgems/mruby-complex/test/complex.rb +++ b/mrbgems/mruby-complex/test/complex.rb @@ -70,6 +70,14 @@ end assert 'Complex#abs' do assert_float Complex(-1).abs, 1 assert_float Complex(3.0, -4.0).abs, 5.0 + if 1e39.infinite? then + # MRB_USE_FLOAT in effect + exp = 125 + else + exp = 1021 + end + assert_true Complex(3.0*2**exp, 4.0*2**exp).abs.finite? + assert_float Complex(3.0*2**exp, 4.0*2**exp).abs, 5.0*2**exp end assert 'Complex#abs2' do -- cgit v1.2.3