文字列数式評価(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. 各項を足し合わせる。
項への分解さえしっかりできれば、速度は若干落ちるだろうが、
(逆)ポーランド記法などにこだわる必要はないと思うのだが、
どうだろう。
コメント
コメントを投稿