おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

計算結果が分数になる電卓

電卓の答えは小数になる

皆さんよくご存知のことですが、電卓で割り算するとその答えは(割り切れなければ)小数になります。 物差しで長さを図るときには、2.3cmのように小数になり、分数にはなりません。 ですから、電卓が小数を使うことは、理にかなっているといえます。

数学では小数が問題になる

ところが、数学では小数が問題になります。 というのは、割り切れないときに小数はその数を正確に表すことが難しいのです。 例えば「サンブンノイチ」

 \displaystyle \frac{1}{3}=0.3333 ...

右辺をどこかで四捨五入すると誤差が生じます。 したがって、その数を正確に表すには無限小数を使わなければなりません。

では無限小数を使えば問題がなくなるかというと、そうではありません。 これでも困ったことが起こります。 それは、0.9999...という無限小数です。 これは1に等しいことが知られています。

 0.9999 ... = 1

そうなると、ひとつの数字が、1と0.9999...という2つの表現を持つことになります。

これらの問題は小数を用いることからきているのです。 それを避けるために数学では分数を主として用います。

分数の計算を分数でしたい

そうなると、分数の計算を分数のまましたくなります。 いつもは小数で良いけれど、時々は分数も使いたい。 でも電卓は分数には対応していない。

そこで、分数を使えるプログラムをさがすと、以前紹介したmaximaなどがそれにあたります。 それで十分ではあるのですが、Rubyで分数をサポートする電卓を作ってみました。

ポイントは式の構文解析

分数の計算自体はRubyのRationalクラスがサポートしています。 ですので、プログラム中で分数計算するのは何も問題ありません。 ポイントは入力された文字列を構文解析して、プログラムに「式として理解させる」ことです。 そのために、例えば1/3+1/2という式を

     +
   /   \
  /     /
 / \   / \ 
1   3 1   2

図のように木構造のデータに直し、それを計算していきます。 ごく簡単に要点をまとめると

この3つになります。

GitHubのレポジトリ

プログラムをGitHubのMath_Programsというレポジトリにアップロードしてあるので、詳細はそちらをご覧ください。 なお、該当のプログラムは

lib/math_programs/acr.rb

です。

このプログラムはgemの形式になっているので、gem buildでビルドして、gem installでインストールすると、コマンドラインから使うことができます。 実行してみましょう。

$ mp23 acr 1/2+1/3
5/6

このように、答えが分数になります。 このレポジトリには他に不定方程式、分子が1になる分数の和で表す問題、拡張テンパズルも入っています。 これらは以前このブログでとりあげたので、そちらも参考になると思います。