[BlueLeaf1336]> PROBLEMS> EvalPad>

計算帳 EvalPad > 基本構造

historyTOP

2009/10/01:作成

能書きTOP

計算用紙のように使える計算機を作ってみたくなりました。きっかけは

というページで見つけた Visual Basic のソース付き電卓です。これがすごい。計算途中を見せてくれます。というわけで目標は少なくともこのソフトだったのですが、途中でソースを解読できなくなりました。原因は、演算子や数字をスタックにつむ方式で書かれていたためです。

ただ、当初のモチベーションがちびてなかったので、技術評論社刊 奥村晴彦著 C言語による最新アルゴリズム事典を参考に、Expression() Term() Factor() 方式(?) でつくり直すことにしました。やっぱりこっちの方がわかりやすい。

2009/10/01TOP

20091001_EvalPad_src.zip(405,424bytes)

起動したときに、同梱の EvalPad.def から関数や定数を読み込んで評価します。ファイルから読んだものは上書き禁止にしています。三角関数なども場合わけのいらないものなどはすべて外に出しているので上書きすると変なことに。

思ったよりも計算してくれます。ただ、理科年表に載っていた地球楕円体に関する計算式はすごい勢いで結果がずれます。残念。それから、正規重力式という長い計算についてもそれなりに。

; 円周率
PI = 3.14159265358979323846264338327950288419716939937510
; 度をラジアンに変換
Rad(Degree) = Degree * PI / 180
; 度分秒を度の小数表示に
ConvDeg(Deg, Min, Sec) = ((Sec / 60) + Min) / 60 + Deg
; 度分秒を度のラジアンに
Rad2(Deg, Min, Sec) = Rad(ConvDeg(Deg, Min, Sec))
; 測地基準系1980正規重力式 [gal] (緯度[度,分,秒])
gamma1980(Deg,Min,Sec) = 978.03267715 (1 + 0.0052790414*sin(Rad2(Deg,Min,Sec))^2 + 0.0000232718*sin(Rad2(Deg,Min,Sec))^4 + 0.0000001262*sin(Rad2(Deg,Min,Sec))^6 + 0.0000000007*sin(Rad2(Deg,Min,Sec))^8)

ここまでが定義式。下が計算結果。理科年表掲載の計算結果から、このプログラムで計算した結果を引いています。で、ずれてる大きさを出してるんですが、うーん。

; 日本各地の緯度と正規重力値
980.65756 - gamma1980(45,24.57,0)[稚内]	= 0.000575356735112109
979.72501 - gamma1980(34,53.49,0)[浜田]	= 0.000473158129011608
979.68694 - gamma1980(34,26.49,0)[福山]	= 0.000452436541763745
979.68067 - gamma1980(34,22.21,0)[広島]	= 0.000192835069697139
979.66284 - gamma1980(34,09.38,0)[山口]	= 0.000344598449373734
979.64507 - gamma1980(33,56.55,0)[下関]	= 0.000502513253763937
979.67606 - gamma1980(34,19.04,0)[高松]	= 3.06727446286459E-5
979.58706 - gamma1980(33,15.07,0)[室戸]	= 7.39958995836787E-5
979.61241 - gamma1980(33,33.26,0)[高知]	= 0.000245814799427535
979.63632 - gamma1980(33,50.38,0)[松山]	= 0.000354654009470323
979.54346 - gamma1980(32,43.25,0)[足摺]	= 0.000236319953842212
979.00606 - gamma1980(24,20.12,0)[石垣島]	= 0.096000201491961
978.99718 - gamma1980(24,47.43,0)[宮古島]	= 0.056058806390979
979.90659 - gamma1980(24,17.03,0)[西表島]	= 1.0000175544111

南にいくとえらいことに。同じ式で計算したとは思えないずれになってる。円周率や三角関数が入るとずれてくるんだろうか? というのは前向きすぎるかも。でも、もう原因突き止める気力がわかん。評価しながら先に進んでいるから計算途中の状態も出せないし。いったんツリー状に組み立てた方がいいのかも。

こんな感じの計算式と答えを自作関数電卓用のサンプルとしてどっさり公開してるページないんだろうか。結構探したけど見つからず。

それはそれとして使いごこちの悪さやなんやもあるけれど、数式の計算はとりあえずいったん置いて、文字式の計算に行く予定。(x+y)^2 の展開とか、同類項をまとめたり。多分別のプログラムにするけれど、最終的には統合したい。

EOFTOP