diff options
| author | Kenta Murata <mrkn@mrkn.jp> | 2019-10-09 10:27:08 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-07-06 01:15:46 +0900 |
| commit | f00efef30ad6eca30e5674493dacbd25b425a4eb (patch) | |
| tree | fb772d0bb5ae51d9be23a537c1fe5825e8ec94e1 | |
| parent | ceb9d516c6d17b0619cf53dfba7cb7b29fe073e4 (diff) | |
[ruby/bigdecimal] Support a Complex in Kernel.BigDecimal()
https://github.com/ruby/bigdecimal/commit/00795cb01f
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3295
| -rw-r--r-- | ext/bigdecimal/bigdecimal.c | 13 | ||||
| -rw-r--r-- | test/bigdecimal/test_bigdecimal.rb | 8 |
2 files changed, 21 insertions, 0 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 23851eea58..3a46bd1c01 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -2629,6 +2629,7 @@ VpNewVarArg(int argc, VALUE *argv) } } + retry: switch (TYPE(iniValue)) { case T_DATA: if (is_kind_of_BigDecimal(iniValue)) { @@ -2666,6 +2667,18 @@ VpNewVarArg(int argc, VALUE *argv) } return GetVpValueWithPrec(iniValue, mf, 1); + case T_COMPLEX: + { + VALUE im; + im = rb_complex_imag(iniValue); + if (!is_zero(im)) { + rb_raise(rb_eArgError, + "Unable to make a BigDecimal from non-zero imaginary number"); + } + iniValue = rb_complex_real(iniValue); + goto retry; + } + case T_STRING: /* fall through */ default: diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index 6928834907..80ef39afd0 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -137,6 +137,14 @@ class TestBigDecimal < Test::Unit::TestCase end end + def test_BigDecimal_with_complex + assert_equal(BigDecimal("1"), BigDecimal(Complex(1, 0))) + assert_equal(BigDecimal("0.333333333333333333333"), BigDecimal(Complex(1.quo(3), 0), 21)) + assert_equal(BigDecimal("0.1235"), BigDecimal(Complex(0.1234567, 0), 4)) + + assert_raise_with_message(ArgumentError, "Unable to make a BigDecimal from non-zero imaginary number") { BigDecimal(Complex(1, 1)) } + end + def test_BigDecimal_with_big_decimal assert_equal(BigDecimal(1), BigDecimal(BigDecimal(1))) assert_equal(BigDecimal('+0'), BigDecimal(BigDecimal('+0'))) |
