From: NISHIMATSU Takeshi Date: 2007-11-19T13:34:16+09:00 Subject: [ruby-list:44245] Re: Float を利用する Ruby プログラム 西松と申します。 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 西松タケシ