質問: ・有理数クラス 実数クラスを継承しています。 浮動小数点型は使用せず、分子(整数)と分母(自然数)の2つのメンバを持つクラスです。 ・実数クラス 無理数を扱いたい場合は、内部では人間が計算するときと同じように、円周率などは3.14...という定数ではなくπという状態を保持し、∛4 なども有理数に変換させず、そのままの形で保持しておきます。 累乗根, 円周率, ネイピア数 等 以外の、人間にも解釈できないような無理数を扱うことは不可能ですが、それが原因で問題が起きる事はないような気がします。 少なくとも有理数に関しては、誤差が出ない事を保証できると思います。
回答: ・有理数クラス { x[0] = 2/3, x[k+1]= x[k] * x[k] } という漸化式を逐次計算するプログラムを考えます。 x[1] = 4 / 9 x[2] = 16 / 81 x[3] = 256 / 6561 x[4] = 65536 / 43046721 x[5] = 4294967296 / 1853020188851841 x[6] = 18446744073709551616 / 3433683820292512484657849089281 6回目の計算で64ビット整数で表現できる値を超えました。 * 計算によっては、約分によって分子・分母が小さくなることがあるが、稀なケースであり、分子・分母が大きくなるケースが多い。 * 一般には、計算に伴って分子・分母が大きくなる可能性が高いので、整数がオーバーフローする可能性を除去できない。 ということで、分子・分母がある一定の数値を超えない特殊な計算を除く、一般的な有理数クラスは現実的ではないと思います。 ・実数クラス * 計算によっては、式が簡単になることがあるが、稀なケースであり、式が複雑になるケースが多い。 * 一般には、計算に伴って式が複雑になる可能性が高く、式の複雑さに比例してデータ構造が複雑になる。 * データ構造の複雑さに伴って、計算時間が長くなり、メモリ消費量も大きくなるので、実時間で計算が終了しない可能性、メモリ不足になる可能性を除去できない。 ということで、式がある一定の複雑さを超えない特殊な計算を除く、一般的な実数クラスは現実的ではないと思います。