summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--complex.c35
-rw-r--r--test/ruby/test_complex.rb7
3 files changed, 47 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index c2ea4b94e6..a9cc1b8814 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Feb 24 22:58:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * complex.c (nucomp_mul): calculate as rotation in complex plane
+ if matrix calculation resulted in NaN.
+
Tue Feb 24 21:45:39 2015 Kazuki Tanaka <mail@tanakakazuki.com>
* test/ruby/test_math.rb(test_cbrt): Add an assertion for Math.cbrt(1.0/0)
diff --git a/complex.c b/complex.c
index 251c120029..a169c95b71 100644
--- a/complex.c
+++ b/complex.c
@@ -17,6 +17,9 @@
VALUE rb_cComplex;
+static VALUE nucomp_abs(VALUE self);
+static VALUE nucomp_arg(VALUE self);
+
static ID id_abs, id_arg, id_convert,
id_denominator, id_eqeq_p, id_expt, id_fdiv,
id_negate, id_numerator, id_quo,
@@ -720,6 +723,38 @@ nucomp_mul(VALUE self, VALUE other)
imag = f_add(f_mul(adat->real, bdat->imag),
f_mul(adat->imag, bdat->real));
+ if ((RB_FLOAT_TYPE_P(real) && isnan(RFLOAT_VALUE(real))) ||
+ (RB_FLOAT_TYPE_P(imag) && isnan(RFLOAT_VALUE(imag)))) {
+ VALUE abs = f_mul(nucomp_abs(self), nucomp_abs(other));
+ VALUE arg = f_add(nucomp_arg(self), nucomp_arg(other));
+ if (f_zero_p(arg)) {
+ real = abs;
+ imag = INT2FIX(0);
+ }
+ else if (RB_FLOAT_TYPE_P(arg)) {
+ double a = RFLOAT_VALUE(arg);
+ if (a == M_PI) {
+ real = f_negate(abs);
+ imag = INT2FIX(0);
+ }
+ else if (a == M_PI/2) {
+ imag = abs;
+ real = INT2FIX(0);
+ }
+ else if (a == M_PI*3/2) {
+ imag = f_negate(abs);
+ real = INT2FIX(0);
+ }
+ else {
+ goto polar;
+ }
+ }
+ else {
+ polar:
+ return f_complex_polar(CLASS_OF(self), abs, arg);
+ }
+ }
+
return f_complex_new2(CLASS_OF(self), real, imag);
}
if (k_numeric_p(other) && f_real_p(other)) {
diff --git a/test/ruby/test_complex.rb b/test/ruby/test_complex.rb
index 1cbab2d834..3625eb97a5 100644
--- a/test/ruby/test_complex.rb
+++ b/test/ruby/test_complex.rb
@@ -289,6 +289,13 @@ class Complex_Test < Test::Unit::TestCase
assert_equal(Complex(Rational(2,1),Rational(4)), c * Rational(2))
assert_equal(Complex(Rational(2,3),Rational(4,3)), c * Rational(2,3))
+
+ c = Complex(Float::INFINITY, 0)
+ assert_equal(Complex(Float::INFINITY, 0), c * Complex(1, 0))
+ assert_equal(Complex(0, Float::INFINITY), c * Complex(0, 1))
+ c = Complex(0, Float::INFINITY)
+ assert_equal(Complex(0, Float::INFINITY), c * Complex(1, 0))
+ assert_equal(Complex(-Float::INFINITY, 0), c * Complex(0, 1))
end
def test_div