文字列数式評価(1)

距離計算の前に、VBAでなるべく高精度を保ちたいと思い、
十進のvariant型をTripleクラスとして使えるようにしようと考えた。

Tripleクラスの既定プロパティとしてValueを作るのだが、
代入の時に

(1)  foo = "5/7"

としても値は倍精度の15桁にしかならない。

(2)  foo = CDec(5)/7

のようにする手もあるが、
CDecの被せ忘れが精度落ちの原因になりかねないし、
何しろめんどくさい。

そこで、(1)の形でも十進型になるように
文字列を数式として評価する関数を作ることにした。

作るにあたり数式評価についてネットを検索したのだが、
さっぱり要領を得ない(というより理解できなかった?)ので、
ここはシンプルに自前で作ることにする。

処理の流れ
 0. 指数関数や平方根など文字列の外にある関数などの値を計算。
 1. かっこがあれば、かっこ内を計算し、1へ。(再帰を使う)
  かっこがなければ、2へ。(残りは四則計算)
 2. 2つ以上続いている符号を(同値関係を保ちながら)
  "+"と"+-"へ置き換え、"+"で項に分解する。(残りは乗除算)
 3. "/"を"*/"へ置き換え、"*"で因数に分解し、
  "/"を含む因数は逆数をとって乗算に直す。
 4. 各項内に(もしあれば)乗算を処理。
 5. 各項を足し合わせる。

項への分解さえしっかりできれば、速度は若干落ちるだろうが、
(逆)ポーランド記法などにこだわる必要はないと思うのだが、
どうだろう。

コメント

このブログの人気の投稿

文字列数式評価(5)~各項の和

文字列数式評価(3)~符号処理