[ruby-list:50202] [ANN] CMathのC実装 - CCMath v2.7
From:
Kazuki Tanaka <mail@...>
Date:
2015-07-05 08:42:55 UTC
List:
ruby-list #50202
こんにちは ^^ ^^ Rubyの標準ライブラリであるCMathをCで実装し直し、Math的な振りまいとCMath的な振りまいを定義域と値域を明示して1つのモジュールで切り分けられるしました. github: https://github.com/gogotanaka/ccmathrubygems: https://rubygems.org/gems/ccmath インターフェイスは悩みましたが暫定的にCCMath.set = ‘R’ #デフォ、MathぽいフルマイCCMath.set = ‘C’ #CMathぽいフルマイ, CMathより早い としています. それぞれ関数の始終域を R -> R, C -> C とみなす事に対応にします. より意味論的に記述するならそれぞれCCMath.domain = FloatCCMath.codmain = Float CCMath.domain = ComplexCCMath.codmain = Complexというノリに近いです. 他には CCMath.set = ‘R’ や CCMath.comp.cos(2i) や CCMath.cos(2i, codomain: Complex) なども考えられます. 定義域ではないオブジェクトが与えられた場合はto_Xでキャストを試みて失敗すればDomainErrorとなります.(実際は高速化のためにto_Xを呼び出す事はしていませんが、to_Xが上書かかれていない限りその様に見なす事ができます) 値域をFloatに指定した場合は返値は常にFloat、Float内に返値がない場合はDomainErrorここで'Float内に返値がない’というRuby的な事実はおおよそ’実数内に返値がない’という数学的事実に対応しますb 値域にComplexを指定した場合は返値は常にComplex、多価関数はブランチポイントに気をつけて主値を定めるよう心がけてはいます(まだまだイマイチ...) またより有効であると思われる近似や式を採択し、エラーハンドリグもより理性的なものにしました(TypeErrorとDomainErrorに統一) 基本的に今のMath, CMathのテストを通すよう努めました(ほとんどのテストは通ってます ^o^)to_fの上書きを無視するなど一部非互換な部分はあります. 今後もシコシコといじって、良い知見が得られればRuby本体のMathやCMathに反映出来たらなと思っています. それでは失礼しました. 田中--===============================Keio university mathematical sciences 田中 和希 Kazuki Tanaka mail: mail@tanakakazuki.comHP: http://gogotanaka.me/Blog: http://blog.gogotanaka.me/Twitter: @gogo_tanakaFacebook: https://www.facebook.com/gogogogotanaka===============================