[#33567] rational, complex and nuby — Tadayoshi Funaba <tadf@...>

ruby に rational と complex を組みこもうと試していて nuby という派生物

21 messages 2008/02/02

[#33580] Re: cgi.rb再構築案 — "Makoto Kuwata" <kwa@...>

桑田といいます。

17 messages 2008/02/03

[#33611] Solaris で timeout.rb が Segmentation fault する。 — shiiya@...

はじめまして。椎屋と申します。

15 messages 2008/02/06
[#33612] Re: Solaris で timeout.rb が Segmentation fault する。 — Nobuyoshi Nakada <nobu@...> 2008/02/06

なかだです。

[#33613] Re: Solaris で timeout.rb が Segmentation fault する。 — shiiya yoshitaka <shiiya@...> 2008/02/06

椎屋です。反応ありがとうございます。

[#33650] Re: Solaris で timeout.rb が Segmentation fault する。 — Nobuyoshi Nakada <nobu@...> 2008/02/08

なかだです。

[#33652] Re: Solaris で timeout.rb が Segmentation fault する。 — SATOH Fumiyasu <fumiyas@...> 2008/02/08

さとうふみやす @ OSS テクノロジです。

[#33621] EUC-KR <-> UTF-8 transition table — "Park Ji-In" <tisphie@...>

朴 芝印です。

15 messages 2008/02/06

[#33628] encdet.rb — Tanaka Akira <akr@...>

前から考えていたのですが、ファイル先頭の magic comment や

18 messages 2008/02/07

[#33662] rational, complex and mathn — Tadayoshi Funaba <tadf@...>

rational は floor、truncate、ceil、round を定義していません。Numeric

66 messages 2008/02/08
[#33663] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/08

他にも問題、課題はあると思います。すぐに解決できるものと、そうでないも

[#33664] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/08

ひとつ書き忘れました。

[#33707] Re: rational, complex and mathn — Yukihiro Matsumoto <matz@...> 2008/02/12

まつもと ゆきひろです

[#33714] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/12

> 原さんのrationalは導入予定がありますので、この機会にもう一度

[#33727] Re: rational, complex and mathn — Shin-ichiro HARA <sinara@...> 2008/02/13

原です。

[#33761] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/13

> 前にふなばさんと個人的なメールのやりとりで、結局また私がrationalをまと

[#33788] Re: rational, complex and mathn — Shin-ichiro HARA <sinara@...> 2008/02/15

原です。

[#33795] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/15

> > それなりに速くはなるし、単純なところでそれなりに満足していますが、一度、

[#33806] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/16

nurat 0.0.2 を出しました (ついでに nucomp も)。

[#33812] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/16

仕様を確認していきたいと思います。

[#33815] Re: rational, complex and mathn — Yukihiro Matsumoto <matz@...> 2008/02/16

まつもと ゆきひろです

[#33818] Re: rational, complex and mathn — Shin-ichiro HARA <sinara@...> 2008/02/16

原です。

[#33819] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/17

> > new!はRubyで実装しているためにだけ必要なので、Cで実装するな

[#33821] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/17

> Rational() は、1つか2つの引数をとる。

[#33827] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/17

> 実際的に重要な機能が Rational() という名前で固定されるのはクラスの定義

[#33845] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/18

もうあまり手を入れないでおこうと思ったのです、つい手を入れてしまいまし

[#33886] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/21

ちょっと実験してみました。原さんの rational は、かけ算割り算が速いので、

[#33888] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/21

で、考えていたんですが、目的は、最速の rational を作ることではなくて、

[#33903] Re: rational, complex and mathn — Shin-ichiro HARA <sinara@...> 2008/02/22

原です。

[#33905] Re: rational, complex and mathn — "NARUSE, Yui" <naruse@...> 2008/02/22

成瀬です。

[#33908] Re: rational, complex and mathn — Yukihiro Matsumoto <matz@...> 2008/02/22

まつもと ゆきひろです

[#33914] Re: rational, complex and mathn — Tadayoshi Funaba <tadf@...> 2008/02/23

> はい。Complexについても1.9の間に組み込んでよいと思います。

[#33679] bigdecimal — Tadayoshi Funaba <tadf@...>

bigdecimal/math.rb の BigMath は、利用者が include してつかうことを前

23 messages 2008/02/09
[#33680] Re: bigdecimal — Tadayoshi Funaba <tadf@...> 2008/02/09

Integer や Float に比べると、BigDicimal() は、1 や 1.1 を受けつけない、

[#33686] Re: bigdecimal — Tadashi Saito <shiba@...2.accsnet.ne.jp> 2008/02/10

斎藤と申します。

[#33698] Re: bigdecimal — Tadayoshi Funaba <tadf@...> 2008/02/11

> 仮にBigDecimal(1.1)を、(二進小数として)受け付けると、「BigDecimalでは、

[#33705] Re: bigdecimal — Yukihiro Matsumoto <matz@...> 2008/02/12

まつもと ゆきひろです

[#33726] Re: [ruby-cvs:22680] Ruby:r15443 (trunk): * bootstraptest/runner.rb, bootstraptest/test_method.rb, enc/depend, — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

14 messages 2008/02/13
[#33730] Re: [ruby-cvs:22680] Ruby:r15443 (trunk): * bootstraptest/runner.rb, bootstraptest/test_method.rb, enc/depend, — "NARUSE, Yui" <naruse@...> 2008/02/13

成瀬です。

[#33889] Re: [ ruby-Bugs-17454 ] irb crash while iterating over all objects — Urabe Shyouhei <shyouhei@...>

卜部です。ちょっとお知恵を拝借したく。

22 messages 2008/02/21
[#33892] Re: [ ruby-Bugs-17454 ] irb crash while iterating over all objects — Nobuyoshi Nakada <nobu@...> 2008/02/21

なかだです。

[#33909] Re: [ ruby-Bugs-17454 ] irb crash while iterating over all objects — Urabe Shyouhei <shyouhei@...> 2008/02/22

Nobuyoshi Nakada さんは書きました:

[#36081] Re: [ ruby-Bugs-17454 ] irb crash while iterating over all objects — TOYOFUKU Chikanobu <nobu_toyofuku@...> 2008/09/01

豊福です。

[#36085] Re: [ ruby-Bugs-17454 ] irb crash while iterating over all objects — Yukihiro Matsumoto <matz@...> 2008/09/01

まつもと ゆきひろです

[ruby-dev:33662] rational, complex and mathn

From: Tadayoshi Funaba <tadf@...>
Date: 2008-02-08 23:06:02 UTC
List: ruby-dev #33662
rational は floor、truncate、ceil、round を定義していません。Numeric 
のまま提供しています。しかし、Numeric のものは、浮動小数点数に変換して
しまうためまともな結果が得られるとは限りません。[ruby-dev:32201]

現状、floor のかわりに to_i をつかって問題がないのは、to_i の定義が 
floor になっているからです。Float#to_i の定義から、Numeric の to_i は 
truncate であるべきだと思います。

Complex(1,2).numerator がエラーになります。rational を読んでいるとエラー
になりません。

$ ruby19  -r complex -e 'Complex(1,2).numerator'
/usr/local/ruby19/lib/ruby/1.9.0/complex.rb:345:in `denominator': undefined method `denominator' for 1:Fixnum (NoMethodError)
        from /usr/local/ruby19/lib/ruby/1.9.0/complex.rb:352:in `numerator'
        from -e:1:in `<main>'

Complex#quo が機能しません。普通に整数割りしてしまいます。

$ ruby19  -r complex -e 'p Complex(1,2).quo(2)'
Complex(0, 1)

$ ruby19  -r complex -r rational -e 'p Complex(1,2).quo(2)'
Complex(0, 1)

complex では、不要に思えるメソッドが放置してあります。>、>=、<、<=、
between?、floor、ceil、round、truncate など。1.8 では、step、<=> も。
あと、% は意味があるのでしょうか。

mathn で、Rational#inspect を書き換えているが、さすがに余計なお世話の
ような気もします。どうしてもしたければ、そういうことは、irb などアプリ
ケーション側でやればいいような気がします。

以下修正案。floor、ceil、truncate、round は原さんの rational からパク
りました。


Index: lib/rational.rb
===================================================================
--- lib/rational.rb	(revision 15409)
+++ lib/rational.rb	(working copy)
@@ -238,6 +238,10 @@
     end
   end
 
+  def div(other)
+    (self / other).floor
+  end
+
   #
   # Returns the remainder when this value is divided by +other+.
   #
@@ -249,7 +253,7 @@
   #   r % 0.26             # -> 0.19
   #
   def % (other)
-    value = (self / other).to_i
+    value = (self / other).floor
     return self - other * value
   end
 
@@ -261,7 +265,7 @@
   #   r.divmod Rational(1,2)   # -> [3, Rational(1,4)]
   #
   def divmod(other)
-    value = (self / other).to_i
+    value = (self / other).floor
     return value, self - other * value
   end
 
@@ -270,7 +274,7 @@
   #
   def abs
     if @numerator > 0
-      Rational.new!(@numerator, @denominator)
+      self
     else
       Rational.new!(-@numerator, @denominator)
     end
@@ -345,10 +349,37 @@
   #   Rational(-7,4) == -1.75                 # -> true
   #   Rational(-7,4).to_i == (-1.75).to_i     # false
   #
-  def to_i
-    Integer(@numerator.div(@denominator))
+
+  def floor()
+    @numerator.div(@denominator)
   end
 
+  def ceil()
+    -((-@numerator).div(@denominator))
+  end
+
+  def truncate()
+    if @numerator < 0
+      return -((-@numerator).div(@denominator))
+    end
+    @numerator.div(@denominator)
+  end
+
+  alias_method :to_i, :truncate
+
+  def round()
+    if @numerator < 0
+      num = -@numerator
+      num = num * 2 + @denominator
+      den = @denominator * 2
+      -(num.div(den))
+    else
+      num = @numerator * 2 + @denominator
+      den = @denominator * 2
+      num.div(den)
+    end
+  end
+
   #
   # Converts the rational to a Float.
   #
@@ -476,10 +507,11 @@
 
 class Fixnum
   alias quof quo
-  undef quo
-  # If Rational is defined, returns a Rational number instead of a Fixnum.
+  remove_method :quo
+
+  # If Rational is defined, returns a Rational number instead of a Float.
   def quo(other)
-    Rational.new!(self,1) / other
+    Rational.new!(self, 1) / other
   end
   alias rdiv quo
 
@@ -488,26 +520,18 @@
     if other >= 0
       self.power!(other)
     else
-      Rational.new!(self,1)**other
+      Rational.new!(self, 1)**other
     end
   end
-
-  unless defined? 1.power!
-    alias power! **
-    alias ** rpower
-  end
 end
 
 class Bignum
-  unless defined? Complex
-    alias power! **
-  end
+  alias quof quo
+  remove_method :quo
 
-  alias quof quo
-  undef quo
-  # If Rational is defined, returns a Rational number instead of a Bignum.
+  # If Rational is defined, returns a Rational number instead of a Float.
   def quo(other)
-    Rational.new!(self,1) / other
+    Rational.new!(self, 1) / other
   end
   alias rdiv quo
 
@@ -519,8 +543,15 @@
       Rational.new!(self, 1)**other
     end
   end
+end
 
-  unless defined? Complex
+unless defined? 1.power!
+  class Fixnum
+    alias power! **
     alias ** rpower
   end
+  class Bignum
+    alias power! **
+    alias ** rpower
+  end
 end
Index: lib/mathn.rb
===================================================================
--- lib/mathn.rb	(revision 15409)
+++ lib/mathn.rb	(working copy)
@@ -121,11 +121,6 @@
 class Rational
   Unify = true
 
-  remove_method :inspect
-  def inspect
-    format "%s/%s", numerator.inspect, denominator.inspect
-  end
-
   alias power! **
 
   def ** (other)
Index: lib/complex.rb
===================================================================
--- lib/complex.rb	(revision 15409)
+++ lib/complex.rb	(working copy)
@@ -104,6 +104,10 @@
   @RCS_ID='-$Id: complex.rb,v 1.3 1998/07/08 10:05:28 keiju Exp keiju $-'
 
   undef step
+  undef <, <=, <=>, >, >=
+  undef between?
+  undef divmod, modulo
+  undef floor, truncate, ceil, round
 
   def scalar?
     false
@@ -199,6 +203,10 @@
       x/y
     end
   end
+
+  def quo(other)
+    Complex(@real.quo(1), @image.quo(1)) / other
+  end
   
   #
   # Raise this complex number to the given (real or complex) power.
@@ -248,6 +256,8 @@
   #
   # Remainder after division by a real or complex number.
   #
+
+=begin
   def % (other)
     if other.kind_of?(Complex)
       Complex(@real % other.real, @image % other.image)
@@ -258,7 +268,8 @@
       x % y
     end
   end
-  
+=end
+
 #--
 #    def divmod(other)
 #      if other.kind_of?(Complex)
@@ -312,8 +323,6 @@
   end
   alias conj conjugate
 
-  undef <=>
-  
   #
   # Test for numerical equality (<tt>a == a + 0<i>i</i></tt>).
   #
@@ -410,9 +419,35 @@
   
 end
 
+class Integer
 
+  unless defined?(1.numerator) # temporal
+    def numerator() self end
+    def denominator() 1 end
 
+    def gcd(other)
+      min = self.abs
+      max = other.abs
+      while min > 0
+        tmp = min
+        min = max % min
+        max = tmp
+      end
+      max
+    end
 
+    def lcm(other)
+      if self.zero? or other.zero?
+        0
+      else
+        (self.div(self.gcd(other)) * other).abs
+      end
+    end
+
+  end
+
+end
+
 module Math
   alias sqrt! sqrt
   alias exp! exp

In This Thread

Prev Next