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

 ささだです.

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

 ささだです.

[ruby-list:44245] Re: Float を利用する Ruby プログラム

From: NISHIMATSU Takeshi <t_nissie@...>
Date: 2007-11-19 04:34:16 UTC
List: ruby-list #44245
西松と申します。

SASADA Koichi wrote:
>  実際に精度がどれくらい必要なのか,今はどれくらい遅いのか,どれくら
> い速くなれば十分なのか,等の利用用途の調査が必要かと考えております.
> 
>  というわけで,まだこの話に付き合ってくれる方,興味のある方はyarv-
> dev@quickml.atdot.net という ML へご参加ください.

別のMLに移動する前に4つほどぼくの思っていることを書きます。
To: ruby-list, CC: yarv-dev です。

以下の4つを解決してくれそうな言語にF#があるのですが、Windowsでしか
使えなさそうなのと、買おうと思っていた本「Expert F#」がなかなか発売
されないので困っています。どんな言語なんでしょうかねぇ。Rubyがんばれ。


■1■遅い
やっぱ遅い。


■2■Rubyで数値計算ができたら、Rubyスクリプトで入力ファイルが書ける
多くの数値計算のプログラムでは必要なパラメータをファイルに書いておいて、それ
を読み込んでから計算を開始するというのが一般的です。たとえば、箱の中にボール
を8つ置いてシミュレーションをする場合、

# 8 balls
box_size = 2.0 2.0 2.0

ball = 0.33333333333333333 0.33333333333333333 0.33333333333333333
ball = 0.66666666666666667 0.33333333333333333 0.33333333333333333 
ball = 0.33333333333333333 0.66666666666666667 0.33333333333333333 
ball = 0.66666666666666667 0.66666666666666667 0.33333333333333333 
ball = 0.33333333333333333 0.33333333333333333 0.66666666666666667
ball = 0.66666666666666667 0.33333333333333333 0.66666666666666667 
ball = 0.33333333333333333 0.66666666666666667 0.66666666666666667 
ball = 0.66666666666666667 0.66666666666666667 0.66666666666666667 

などというファイルを用意するわけです。この方法には、自前でパーサを書かなけれ
ばいけないという欠点があります。パーサはコメント行や空行を読み飛ばしたり、
box_sizeやballなどのラベルを識別できなくてはいけません。エラー処理も欲しい
ところです。ball = 0.5 2.0/3 1/7.5 と書けるようにするためにはかなり複雑な
パーサが必要になります。パラメータを少しずつ変えて複数のシミュレーションを
するときにはシェルスクリプトなどで、入力ファイルを生成→プログラム実行、を
繰り返させたりします。Rubyで数値計算ができたら、たとえば

# 8 balls 文法的に間違っていたらごめんなさい。
box = Box.New

(1..2).each do |z|
  (1..2).each do |y|
    (1..2).each do |x|
      box.put_ball(x/3.0, y/3.0, z/3.0)
    end
  end
end

size=3.0
while size<=5.0
  box.box_size(size)
  box.do_simulation
  size+=0.1
end

と書けるようになります。これはとてもうれしいです。


■3■数学関数が足りない
現在のRubyは数学関数がちょっと足りません。以前、erf()とerfc()のパッチを採用
していただいたことがあるのですが、missing/erf.cを書かなければいけないのがやっ
かいでした。また、このファイルのライセンスでご迷惑をかけてしまったようでした。
もうC99にある数学関数ならmissingなしでもいいじゃん、と思います。

一方、Rubyの利点は型総称数学関数が簡単に書けることですね。引数がFloatなら
返り値もFloat、ComplexならComplexってやつ。Fortranなら当たり前で、Cだと
tgmath.hをインクルードするってやつです。


■4■精度はdoubleだけでよい
現在の多くのCPUは64bitで表されるいわゆる倍精度浮動小数点数の計算が高速で走る
ように設計されています。また、応用上、倍精度浮動小数点数で十分な場合がほとん
どです。拡張精度浮動小数点数や可変長精度浮動小数点数を取り扱えるにこしたこと
はないですが、いたずらに複雑になるだけなので、将来だれかが書いてくれるライブ
ラリに期待するのがよいのではないでしょうか。gfortranではGMPとMPFRライブラリ
を使ってゴニョゴニョやっているようですが。

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



In This Thread