[#44237] Float を利用するRubyプログラム — SASADA Koichi <ko1@...>

 ささだです.

16 messages 2007/11/17
[#44241] Re: Float を利用するRubyプログラム — SASADA Koichi <ko1@...> 2007/11/19

 ささだです.

[ruby-list:44268] Complex#cproj patch for ruby-1.9/lib/complex.rb

From: NISHIMATSU Takeshi <t_nissie@...>
Date: 2007-11-21 22:11:04 UTC
List: ruby-list #44268
西松と申します。

--- in [ruby-list:44250] I wrote:
> cproj    リーマン球への射影(lib/complex.rbにすぐにでも入れることができそう。)

パッチです。メソッド名は Complex#project_onto_the_Riemann_sphere とかのほうがよいのかしら。
--- lib/complex.rb      (revision 13994)
+++ lib/complex.rb      (working copy)
@@ -309,6 +309,21 @@
     Complex(@real, -@image)
   end
   alias conj conjugate
+  
+  #
+  # Projection onto the Riemann sphere
+  #
+  def cproj
+    if @real.infinite? or @image.infinite?
+      if @image>=0.0
+        Complex.new(1.0/0.0, 0.0)
+      else
+        Complex.new(1.0/0.0, -0.0)
+      end
+    else
+      self
+    end
+  end
 
   undef <=>
   

パッチを書いていて気がついたこと2点:

(1)Complex(-0.0, -0.0)では複素数の虚部を-0.0にできない
$ ruby -r complex -e 'p Complex(-0.0, -0.0)'
Complex(-0.0, 0.0)

(2) tool/compile_prelude.rb をリビジョン 13873 のモノに戻さないとコンパイルできませんでした
$ sh config.guess
i686-pc-linux-gnu
$ gcc --version
gcc (GCC) 4.3.0 20071107 (experimental)
$ svn up
リビジョン 13994 です。
takeshi@nishimatsu:~/Linux/work/ruby/ruby/ruby-1.9$ make
./miniruby  -I. -rrbconfig ./tool/compile_prelude.rb ./prelude.rb ./gem_prelude.rb prelude.c
./tool/compile_prelude.rb:76:in `eval': undefined method `+' for nil:NilClass (NoMethodError)
        from (eval):13:in `block (2 levels) in <main>'
        from (eval):4:in `each'
        from (eval):4:in `zip'
        from (eval):4:in `call'
        from (eval):4:in `each'
        from (eval):4:in `each_with_index'
        from (eval):4:in `<main>'
        from ./tool/compile_prelude.rb:76:in `eval'
        from ./tool/compile_prelude.rb:76:in `<main>'
make: *** [prelude.c] エラー 1
$ svn up -r 13873 tool/compile_prelude.rb
$ make   #===> Okay.

-- 
love && peace && free_software
西松タケシ



In This Thread