[BlueLeaf1336]> PROBLEMS> EvalPad>
history | TOP |
2009/10/01:作成
能書き | TOP |
計算用紙のように使える計算機を作ってみたくなりました。きっかけは
というページで見つけた Visual Basic のソース付き電卓です。これがすごい。計算途中を見せてくれます。というわけで目標は少なくともこのソフトだったのですが、途中でソースを解読できなくなりました。原因は、演算子や数字をスタックにつむ方式で書かれていたためです。
ただ、当初のモチベーションがちびてなかったので、技術評論社刊 奥村晴彦著 C言語による最新アルゴリズム事典を参考に、Expression() Term() Factor() 方式(?) でつくり直すことにしました。やっぱりこっちの方がわかりやすい。
2009/10/01 | TOP |
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 の展開とか、同類項をまとめたり。多分別のプログラムにするけれど、最終的には統合したい。
EOF | TOP |