- ベストアンサー
分数計算で分母と分子を維持するには?
- 1/2+1/3と引数を渡して、5/6という返り値を得る汎用のライブラリは存在するのでしょうか?
- 現状では1/2+1/3=0.5+0.33333333=0.833333333と計算されていますが、厳密な分数を求める方法を知りたいです。
- MathematicaやMapleなどの代数ソフトウェアをC#から呼び出すことは可能ですが、費用がかかるため、1万円以下で利用できる分数計算のライブラリを探しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
若干ずれた回答かもしれませんが、外部から他の数式処理システム呼び出してもよく、市販の数式処理ソフトが高価な事が問題なのであれば、Maximaのようなフリーのものを使うというのはダメでしょうか? 私はMaximaしか使ったことありませんし、外部から呼び出したことはないので、連携のしやすさなどはちょっとわからないのですが、フリーの数式処理ソフトは結構あるみたいですよ。 http://ja.wikipedia.org/wiki/%E6%95%B0%E5%BC%8F%E5%87%A6%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%B8%80%E8%A6%A7
その他の回答 (4)
- kmee
- ベストアンサー率55% (1857/3366)
C#なら、分子と分母を持ったクラスに定義して、演算子をオーバーロードして分数計算するようにすれば、そんなに難しいことでは無いと思うのですが。 例えば、class rとして定義。 コンストラクタとして r(int 分子, int 分母) r(int 分子) // 分母=1 とすれば > {(5.5+25/15)÷73.7+12/15}-152 } → ( r(5,10) + r(25) / r(15) ) / r(737,10) + r(12)/r(15) - r(152) ) でいいはずです。 整数の桁を考えなければ、そんなに難しいことじゃないですよ。
- Tacosan
- ベストアンサー率23% (3656/15482)
「式を (文字列かなにかで) 与えたら計算してくれる」というのと「(単に) 計算する」というのとでは難易度が違うのでねぇ. 後者は, 例えば Gnu MP のラッパーがあるみたいなのでそれでなんとかできないかな. 前者も, たぶん (構文解釈として) 調べればあるんじゃないかなぁ.
- tatsu99
- ベストアンサー率52% (391/751)
rubyという言語はrationalという型(クラス)をもっています。 これは、分数を計算するための型です。 --------------------------------- a = Rational(1,2) b = Rational(1,3) c = a + b p c ------------------------- 上記はrubyのコードですが a = 1/2 b = 1/3 c = a+ b cの内容を表示 を行なっています。 上記を実行すると 5/6が結果として得られます。 rubyのこの機能を使用すればよいかと思います。 尚、C#から直接呼び出したい場合は、 マイクロソフトからironruby(.NETで動作するruby互換のスクリプトエンジン) が提供されています。 以下のURLを参照ください。 ironruby http://ironruby.net/ Rational クラス http://www.ruby-lang.org/ja/old-man/html/Rational.html ruby本家 http://www.ruby-lang.org/ja/ C#からironrubyを呼び出す方法 http://www.m-tea.info/2009/12/c-ironruby-1.html
お礼
ご教示ありがとうございます!! 当方.net専従で、rubyは食わず嫌いしてたのですが、いい機会と考えてあたってみます。
- asuncion
- ベストアンサー率33% (2127/6289)
(b/a)+(d/c)=(ad+bc)/acですね。 そこで、分母と分子をメンバーとして持つような構造体を typedef struct { int bunbo; int bunshi; } bunsuu; のように定義して、 bunsuu f(bunsuu x, bunsuu y); というプロトタイプを持つ関数を書けばよいのではないでしょうか。 そういう話ではなくて、別のことをおっしゃっていますか?
お礼
早々の解答ありがとうございます。 >そういう話ではなくて、別のことをおっしゃっていますか? 質問文がやや誤解させるもので申し訳ございません。 構造型を定義して、自前で通分・約分する関数を作って、演算オペレータを解釈して、{}()の優先順位を判断して...は正しい方向性かと思います。 しかし、たとえば{(5.5+25/15)÷73.7+12/15}-152みたいな式を与えて、 分数での厳密解を得るものは難しくて、私には作れそうもありません。 で、{(5.5+25/15)÷73.7+12/15}を与えると答え=○○/△△を返す汎用ライブラリがあれば.. ということであります。 既述したように○十万円する数式処理システムは、一発で解答を出す由でありますが 如何せん庶民には手が届きません~~
お礼
ありがとうございます。 Maximaには十分ポテンシャルがあるようですね。 ただ.netとの連携がMathematicaやMapleほどではないようです。 Googleすると http://www.math.utexas.edu/pipermail/maxima/2009/016554.html という記事をみつけました。 ややダサい連携方式のようにも思えますが、この方法とNo2さんご指摘のRuby方式と 両者を比較して実現可能性が高いもので作りこみたいと思います。
補足
みなさんご回答ありがとうございました。 「Maximaにお伺いをたてる→答えをもらう」方式で解決させました。 後学のために記すと、 1.SocketServerを作って、任意のポート(m_PortNum)をlistenする。 2.1.のあと、maxima.bat -s m_PortNumとすると、MaximaがClientになってSocketServerに自動接続する(IPアドレスをどのように処理and/or指定するのかは不明だが、ローカルPC同士なので127.0.0.1で決め打ち?) 3.ServerとMaxima間でtalk開始。 MaximaがMathematicaやMapleに劣らない強力なツールであることも分かりました。