Web 上のいろいろなサンプルを参考にして、計算式を 有理数で処理する例を作成した。
有理数で処理するというのは、
"1/3 +1/2" を 0.833333 とせずに
5/6 の分数として計算する
ということ。
もちろん (1/3) * 3 は 0.9999... でなく、正確に 1 として計算する。
現状でのソースコードは以下。有理数クラスと、計算式パーサー から構成される。
有理数クラス
----------------
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/rational/
Main.scala // 有理数クラスの呼び出しサンプル
Rational.scala // 有理数クラスの実装
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/test/rational/
RationalTest.scala // 有理数クラスの junit テストケース
計算式パーサー
-------------------
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/calc/dsl/
calc3.scala // 実装
これに対する junit テストは未作成。
ただし、BigDecimal で計算をするケースでの計算式パーサーとその junit テストが以下にある。
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/calc/dsl2/
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/test/calc/dsl2/
じつは、この計算処理を RemoteActor で client/server 構成にした例も作成してある。
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/calc/dsl/
server.scala
client.server
である。
使い方は2つのコンソールを開き、
コンソール1: $ scala -cp . calc.dsl.server
コンソール2: $ scala -cp . calc.dsl.client
とするだけである。
client 側で 数式を入力して改行すると、計算結果が表示される。
空行の入力で client プログラムは終了する。(server 側は 現状では ctrl-c で中止するしかない)
計算結果は、分数形式と小数形式の2通りで返ってくる。循環小数部は { } で囲んで表す。( 0.33333 は 0.{3} となる。)
クライアント側の操作画面例を示す。(太字が入力文字)
--- ここから ---
$ scala -cp . calc.dsl.client
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 -Xmx1024m
Start client.
Input Expression:
1
result:None (=1)
Input Expression:
1/3
expr: 1/3
result: 1/3
resultx: 0.{3}
Input Expression:
1/2+1/3
expr: 1/2+1/3
result: 5/6
resultx: 0.8{3}
Input Expression:
355/113
expr: 355/113
result: 355/113
resultx: 3.{1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168}
Input Expression:
// <- ここは 空行を入力した
Stop client.
---- ここまで ------
google の検索で "1/2 + 1/3" と入力すると
(1 / 2) + (1 / 3) = 0.833333333
と表示されるが、 "5/6" とは表示されない。
表計算ソフトでもこのような有理数計算モードが選べるようになると良いとおもう。
P.S. [業務連絡] この投稿と sourforge.jp への commit は許可取得済
最近のコメント