分数
分数クラスを作ってみた。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++だとできるのかなあ…