ホーム ] TIPS ウィンドウズ系 ] TIPS グラフィックス系 ] TIPS メルチメディア系 ] TIPS 理数系 ] TIPS 総覧 ]

上へ
S0001 数式処理
S0002 数式演算
S0003 陰関数のグラフ
S0004 モンテカルロ法
S0005 最小自乗法
S0006 高速冪乗算
S0007 正規乱数
S0008 相関係数
S0101 高速ソート
S0102 高速検索

VB.NET2005 TIPS / 理数系

S0002 数式演算

最終更新:2007/05/10 再掲

●解説

 S0001 数式処理で得られた後置記法の文字列数式を演算する方法。但し記号演算ではなく、変数などに値を代入して数値演算する方法である。

●原理

 オペランド、オペレータ(数学関数含む)などの因子を取り出し、オペランドなら値スタックにスタッキング し、オペレータなら、値スタックから必要なオペランドをラストアウトし、そのオペレータで演算し、値スタックに積む。数式がなくなったら、値スタックに残った値が求める解となる。

A+B*Cの後置記法である ABC*+ を例にして以下に解説する。この場合はA、B、Cは数値であるとする。

  1. Aを文字列から取り出す。オペランドなので、値スタックに積む。
  2. Bを文字列から取り出す。オペランドなので、値スタックに積む。
  3. Cを文字列から取り出す。オペランドなので、値スタックに積む。
  4. *を文字列から取り出す。*はオペレータなので、値スタックから、CとBを取り出し、B*Cの演算をし、その結果mを値スタックに積む。この時、オペランドの順番は大切 (- や/、^の時は答えを間違ってしまう。)。
  5. +を文字列から取り出す。+はオペレータなので、値スタックから、mとAを取り出し、A+mの演算をし、その結果vを値スタックに積む。vが演算結果である。

●仕様

○数式仕様

 S0001 数式処理に同じとする。単純演算子の場合は、オペランドが二つ、関数の場合は、オペランドは一つである。

○変数、定数への代入

 変数、常数、定数があれば、文字ではなく、値を別途見つけてスタックする。
 
●方法

 以下のような処理方法、手順となる。

  1. 値スタックを置く。

  2. 数式(因子列)から因子を一つ取り出す。

  3. オペランドであれば、以下のようにして値を代入し、値スタックに積む。
      ・数値:リテラルからDoubleに変換し値スタックに積む。
      ・変数:X,Yかによって、別途用意されたプログラム上の変数の値を値スタックに積む。
      ・定数:定数配列から対応する値を持ってきて値スタックに積む。
      ・常数:今のところ、π のみ。コモン常数PIの値を値スタックに積む。
    オペレータであれば、以下のようにしてオペランドを得て、演算し値スタックに積む。
      ・単純演算子:値スタックから、値v1(最上部)、v2(二番目)を取出し、v2 op v1 とし、結果を値スタックに積む。
     ・関数:値スタックから、値v1(最上部)のみを取出し、f(v1)を演算(標準関数の呼出、あるいは自分で演算)し、結果を値スタックに積む。

  4. 2.から繰り返す。

  5. 数式(因子列)がなくなったら終了。