[前][次][番号順一覧][スレッド一覧]

ruby-changes:62137

From: Kenta <ko1@a...>
Date: Mon, 6 Jul 2020 08:56:20 +0900 (JST)
Subject: [ruby-changes:62137] 03a33603c6 (master): [ruby/bigdecimal] Add Complex#to_d

https://git.ruby-lang.org/ruby.git/commit/?id=03a33603c6

From 03a33603c66bf6eca6937d221f87daf3f5a489f7 Mon Sep 17 00:00:00 2001
From: Kenta Murata <mrkn@m...>
Date: Wed, 9 Oct 2019 10:39:39 +0900
Subject: [ruby/bigdecimal] Add Complex#to_d

https://github.com/ruby/bigdecimal/commit/97e794ac97

diff --git a/ext/bigdecimal/lib/bigdecimal/util.rb b/ext/bigdecimal/lib/bigdecimal/util.rb
index 4ece834..66fff78 100644
--- a/ext/bigdecimal/lib/bigdecimal/util.rb
+++ b/ext/bigdecimal/lib/bigdecimal/util.rb
@@ -131,6 +131,39 @@ class Rational < Numeric https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/lib/bigdecimal/util.rb#L131
 end
 
 
+class Complex < Numeric
+  # call-seq:
+  #     cmp.to_d             -> bigdecimal
+  #     cmp.to_d(precision)  -> bigdecimal
+  #
+  # Returns the value as a BigDecimal.
+  #
+  # The +precision+ parameter is required for a rational complex number.
+  # This parameter is used to determine the number of significant digits
+  # for the result.
+  #
+  #     require 'bigdecimal'
+  #     require 'bigdecimal/util'
+  #
+  #     Complex(0.1234567, 0).to_d(4)   # => 0.1235e0
+  #     Complex(Rational(22, 7), 0).to_d(3)   # => 0.314e1
+  #
+  # See also BigDecimal::new.
+  #
+  def to_d(*args)
+    BigDecimal(self) unless self.imag.zero? # to raise eerror
+
+    if args.length == 0
+      case self.real
+      when Rational
+        BigDecimal(self.real) # to raise error
+      end
+    end
+    self.real.to_d(*args)
+  end
+end
+
+
 class NilClass
   # call-seq:
   #     nil.to_d -> bigdecimal
diff --git a/test/bigdecimal/test_bigdecimal_util.rb b/test/bigdecimal/test_bigdecimal_util.rb
index b963fcd..c4d5816 100644
--- a/test/bigdecimal/test_bigdecimal_util.rb
+++ b/test/bigdecimal/test_bigdecimal_util.rb
@@ -60,6 +60,18 @@ class TestBigDecimalUtil < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/bigdecimal/test_bigdecimal_util.rb#L60
     assert_raise(ArgumentError) { 355.quo(113).to_d(-42) }
   end
 
+  def test_Complex_to_d
+    assert_equal(BigDecimal("1"), Complex(1, 0).to_d)
+    assert_equal(BigDecimal("0.333333333333333333333"),
+                 Complex(1.quo(3), 0).to_d(21))
+    assert_equal(BigDecimal("0.1234567"), Complex(0.1234567, 0).to_d)
+    assert_equal(BigDecimal("0.1235"), Complex(0.1234567, 0).to_d(4))
+
+    assert_raise_with_message(ArgumentError, "can't omit precision for a Rational.") { Complex(1.quo(3), 0).to_d }
+
+    assert_raise_with_message(ArgumentError, "Unable to make a BigDecimal from non-zero imaginary number") { Complex(1, 1).to_d }
+  end
+
   def test_String_to_d
     assert_equal(BigDecimal('1'), "1__1_1".to_d)
     assert_equal(BigDecimal('2.5'), "2.5".to_d)
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]