分数

分数クラスを作ってみた。naiveな実装なので、ここでは実装を示さない。

forで、100000回四則演算を繰り返すプログラムを書いて、doubleと比較してみるとやっぱり遅い。ReleaseでBuildするとずいぶん早くはなるが、やっぱり体感で5倍くらい遅い感じか。*1いや、.net frameworkβ版だからベンチマークを公開しちゃいけないのかな*2

doubleだと、数値を比較するのに、

(d1 - d2)^2 < eps

としなくちゃならないから、ちょっとは差が縮まるかな、と思ったけれども、よく考えたら必要になるのは2次元とか3次元とかの座標の近い遠いなので、結局距離を計算する必要があるので、分数クラスはやっぱり有利ではないのでした。

誤差が蓄積してえらいことになった話をよく聞くので、いい解決策になると思ったのですが。

いや、暗黙の型変換演算子を適当に定義しておけば、Genericsで置換できるので、正確な分数ルーチンと高速な不動小数点型ルーチンを簡単に切り替えられるのかなあ。

※だめ

class Foo<T> {
  public Bar(T x, T y) {
    T z = x + y;
  }
}

のようなクラスは定義できない。Tに対して+を適用できるかどうかがわからないから、これは不正なプログラムになってしまう。C#不便だなあ。C++だとできるのかなあ…

*1:時間を計る方法を知らないだけ(てきとーなのでよければ、ちょっとライブラリを調べればあるだろうけど)

*2:ライセンスよく読んでないんで知りません