image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ:朝つくった“胸の谷間”キープできるのは何時まで, Appleのようなデザインをするためのコーディングチュートリアル, etc... | トップページ | ピックアップ:甦る 実物大ガンダム!, マスメディアを殺せば日本は圧倒的に独り勝ちする, etc... »

2009-12-23

Scala で 有理数処理を

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 は許可取得済

« ピックアップ:朝つくった“胸の谷間”キープできるのは何時まで, Appleのようなデザインをするためのコーディングチュートリアル, etc... | トップページ | ピックアップ:甦る 実物大ガンダム!, マスメディアを殺せば日本は圧倒的に独り勝ちする, etc... »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/47095332

この記事へのトラックバック一覧です: Scala で 有理数処理を:

« ピックアップ:朝つくった“胸の谷間”キープできるのは何時まで, Appleのようなデザインをするためのコーディングチュートリアル, etc... | トップページ | ピックアップ:甦る 実物大ガンダム!, マスメディアを殺せば日本は圧倒的に独り勝ちする, etc... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク