compat.norational
- 有理数のない算術演算 ¶リリース 0.8.7 までは、Gauche は正確な有理数をサポートしていませんでし
た。2/3
のような有理数リテラルを読み込むことはできていましたが、
約分して整数になる場合をのぞいては、その場で非正確な実数に変換されてい
ました。正確な整数を正確な整数で割った場合も約分して整数になる場合をの
ぞき、結果は非正確な実数になりました。
リリース 0.8.8 ではもうこのようなことはありません。正確な数同士の割り 算の結果は常に正確な数になります。ゼロで割ったときはもちろん例外です。
(/ 2 3) ⇒ 2/3 (/ 5) ⇒ 1/5 (/ 4 2) ⇒ 2
計算は正確な値でできますが、ひとつ欠点もあります。正確有理数演算は整 数演算や非正確実数同士の演算にくらべてはるかに遅いのです。意図せず、計 算の初期段階で有理数を生成してしまうとその後の計算にはすべて正確な演算 が適用されてしまい性能は悲惨なことになります。
この問題を解決する適切は方法は適切な場所にexact->inexact
を挿入
することです。しかし、この変換を簡単におこなうには、このモジュールをイ
ンポートし、割り算に/
を使うだけですみます。
(use compat.norational) (/ 2 3) ⇒ 0.6666666666666666 (/ 5) ⇒ 0.2 (/ 4 2) ⇒ 2
効果はグローバルには起こらず、明示的にcompat.norational
をインポー
トしたモジュールでのみ有効です。
このモジュールは/
を再定義しているだけです。したがって、コードに
正確な有理数のリテラルが含まれていても、それは非正確な実数に変換される
ことはなく、正確な有理数としてあつかわれます。Gaucheに非正確な実数とし
て有理数リテラルを扱わせるには、#i
という接頭辞を追加しなければ
なりません。
gosh> 1/3 1/3 gosh> #i1/3 0.3333333333333333