_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ mod_fx _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 【作者】 : motchy 【最終更新】 : 2015/08/23 【バージョン】 : 4.0.1 【動作確認環境】 : Hot Soup Processor 3.4 RC2 以降 (※最新版を推奨) 【開発環境】 : Hot Soup Processor 3.4 ------------------------------------------------------------------------------------------------------------------------ < 概要 > 文字列で表現された数式の値を求めるモジュールです。 HSP標準命令のみで構成されているため hsp3dish 上でも動作します。 一部の特殊な機能を除いて android 版 hso3dish 上でも動作します。 (※ android 版 hsp3dish の不具合の為、2015/08/23 現在、一部の特殊な機能が動作しません。) ------------------------------------------------------------------------------------------------------------------------ < 説明・使い方 > < 数式の文法 > < トークン長 > 1トークンの長さの最大は128バイト < 大文字と小文字について > 大文字と小文字は区別される。 < 定数 > 次の定数があらかじめ定義されている。 m_pi : 円周率。3.141592653589793。 m_e : ネイピア数。2.718281828459045。 < 変数 > 変数名には次の規則がある。 ■ 先頭が半角数字でない ■ 演算子と同じ名前が含まれない ■ 予約語でない 変数は最大100個まで定義できる。定義の解除も可能。 1次元配列も扱える。配列の場合は要素数の最大値は10000。 定義された変数には0〜99のIDが割り振られる。原則として未使用のIDのうち最も若いものが割り当てられる。 変数の内容を書き換えただけならすでにコンパイルされている数式の再コンパイルは必要ない。(これを利用して数学グラフ等を高速に描ける) ある変数の定義を解除した後に同名の変数を再定義した場合、同じIDが割り振られるとは限らないので、 その変数を含む以前の数式はコンパイルし直す必要がある。 < 利用できる演算子と優先順位 > < 演算優先順位 > C言語に倣った優先順序である。 < 1 > () : 演算順序制御 関数名() : 関数呼び出し 配列変数名() : 配列の要素参照 非配列変数名 : 非配列変数の内容参照 < 2 > * : 乗算 / : 除算 % : 剰余 \ : 剰余 < 3 > + : 加算 - : 減算 < 4 > << : 左ビットシフト >> : 右ビットシフト < 5 > < : 小なり <= : 小なりイコール > : 大なり >= : 大なりイコール < 6 > = : 等価 == : 等価 ! : 不等価 != : 不等価 < 7 > & : ビット積 < 8 > ^ : ビット排他的論理和 < 9 > | : ビット和 < 10 > , : 順序演算子 < 備考 > ■ 同じ優先順位の演算子が並んでいる場合は左にあるものほど順位が高い。 ■ <,>,<=,>= について。例えば a < b が真であれば a < b が double(1) に置き換えられる。   偽であれば 0 に置き換えられる。 ==,=,!=,= も同様。 < ()について > () は次の用途で用いられる。 ■ 優先順序制御 ■ 配列の添え字 ■ 関数のパラメータ () の代わりに {},[] を用いてもよい。内部処理で () に置き換えられる。 < 特殊な規則 > ■ 任意の位置に半角スペースを入れてよい。 < 備考 > ■ 負号付きの数は括弧で囲まなければならない   (例)   3*-2 ←×   3*(-2) ←○     ※正確に言うと、「負号は、演算子の優先順位に基づいて数式を計算していく過程でその負号を処理する正にその時において    その左隣に 数値 ( , のいずれかが出現しているか、もしくはその負号自体が数式の左端でなければならない。」    このルールに基づくと、次の式は正しい。        exp(-2+x) - (-3+y) ■ 配列変数の添え字は省略できない < 関数 > < 利用できる関数 > sin : 正弦 cos : 余弦 tan : 正接 asin : 逆正弦。asin(u)。 asin2 : 逆正弦。asin2(y,x)。(※atan2と同じ) acos : 逆余弦。acos(u)。 acos2 : 逆余弦。acos2(y,x)。(※atan2と同じ) atan : 逆正接。atan(u)。 atan2 : 逆正接。atan2(y,x)。HSPのatanと同じ。 sinh : 双曲線余弦 cosh : 双曲線余弦 tanh : 双曲線正接 asinh : 双曲線逆正弦 acosh : 双曲線逆余弦 atanh : 双曲線逆正接 sqrt : 正の平方根 exp : 指数値。eのx乗。 pow : 累乗。powf(底,指数)。 log : 対数。log(底,真数)。 ln : 自然対数 log10 : 常用対数 limit : 制限。limit(ターゲット,最大値,最小値)。 max : 最大値。max(数式1,数式2,...,数式n)。 min : 最小値 abs : 絶対値 floor : 床関数 round : 四捨五入 ceil : 天井関数 int : 0の方向に丸める sgn : 符号関数 factorical : 階乗 perm : 順列の総数。perm(要素数,取り出して並べる個数) combi : 組み合わせの総数。combi(要素数,取り出す個数) deg2rad : 度数法から弧度法へ変換 rad2deg : 弧度法から度数法へ変換 < 数式処理 > < 前提 > 内部的にはすべての数を64bit精度実数値として扱う。 < 用語 > < 文字列式 (StringExpression) > 文字列で表現された数式。 < 式の深さ > ( ) の内側は( )がある位置よりも1深いと定義する。 例えば「(a(1)+2*(3+4))」の「( )」の部分は深度0で、「 a( )+2*( ) 」の部分は深度1。「 1 3+4 」の部分は深度2。 < トークン識別値 (TIV) > 各トークンの種類に応じて対応する識別値。 (※参考↓) 0 : 数式の外界 10 : 数値 100 : ( 101 : ) 120 : , 140 : | 160 : ^ 180 : & 200 : == 201 : = 202 : != 203 : ! 220 : < 221 : <= 222 : > 223 : >= 240 : << 241 : >> 280 : + 281 : - 300 : * 301 : / 302 : % 303 : \ 1000 : 第0変数 ・・・・・・ 1099 : 第99変数 10000 : sin 10001 : cos 10002 : tan 10010 : asin 10011 : asin2 10012 : acos 10013 : acos2 10014 : atan 10015 : atan2 10020 : sinh 10021 : cosh 10022 : tanh 10030 : asinh 10031 : acosh 10032 : atanh 10100 : sqrt 10200 : exp 10220 : pow 10300 : log 10320 : ln 10330 : log10 10400 : limit 10500 : max 10501 : min 10600 : abs 10700 : floor 10720 : round 10740 : ceil 10760 : int 10800 : sgn 10900 : factorical 11000 : perm 11001 : combi 20000 : deg2rad 20001 : rad2deg 30000 : m_pi 30001 : m_e < 定数ID > 定義済み定数に割り当てるID。 0 : m_pi 1 : m_e IDがaである定数を「第a定数」と呼ぶ。 < 定数表 > 定数を管理するための配列の総称。 詳しくは「base.txt」を参照。 < 変数表 > 変数を管理するための配列の総称。 詳しくは「base.txt」を参照。 < トークンキャラクタコード (TCC) > 文字列式をトークン単位で区切ったコード。 トークンの数は必ず文字列式のバイト数以下になる。 詳しくは「base.txt」を参照。 < TCC配列 (TCCA) > TCCのトークンを格納する1次元文字列型配列。 要素(i)に第iトークンが格納される。 < TIVコード (TIVC) > TCCの各トークンをTIVに置き換えたコード。 詳しくは「base.txt」を参照。 < TIVC配列 (TIVCA) > TIVCを格納するint型1次元配列。 要素(i)に第iトークンのTIVが格納される。 < トークン実値コード (TRVC) > 各トークンについて、それが数値もしくは定数である場合にその値を記録するコード。 詳しくは「base.txt」を参照。 < TRVC配列 (TRVCA) > TRVCを格納するdouble型1次元配列。 要素(i)に第iトークンに対応する値が格納される。 < 計算コード (CALCODE) > 計算の順序を記録したコード。これに基づいてTIVCが処理される。 詳しくは「MethodOfCalculation.pdf」を参照。 長さは必ずTCCの3倍以下になる。 < 計算コード配列 (CCA) > 計算コードを格納した配列。 < 数式コード > TIVC,TRVC,CALCODEの総称。 < ルーチン > ■ mfx_init モジュールの初期化。 変数はすべてリセット(定義解除)される。 HSPランタイム起動後、初めて本モジュールを使う前に必ず実行すること。 [書式] mfx_init ■ mfx_defvar 変数の定義。 新しく定義された変数は内容が double(0) でクリアされる。 [書式] mfx_defvar "変数名",len len : 配列の要素数。0or1なら非配列。 [実行後のstatの値] (0〜99,-1,-2,-3,-4) = (新変数のID,ID枯渇,既存の同名変数あり,変数名不正,len不正) ■ mfx_undefvar 変数の定義解除 [書式] mfx_undefvar "変数名" [実行後のstatの値] (0,1,2) = (成功,指定された変数がない,変数名が無効) ■ mfx_VarInfo 変数の情報取得 [書式] mfx_VarInfo "変数名",len len : 配列の要素数を受け取る変数。非配列の場合は1が格納される。 [実行後のstatの値] (0〜99,-1,-2) = (その変数のID,指定された変数がない,変数名が無効) ■ mfx_LookVarVal 変数の値の取得 [書式] mfx_LookVarVal x, vid,eid x : 結果を受け取る変数 vid : 変数ID eid : 要素番号。非配列の場合は0を指定。 [実行後のstatの値] (0,1,2) = (成功,vid不正,e不正) ■ mfx_PutVarVal 変数への値の代入 [書式] mfx_PutVarVal vid, eid, val vid : 変数ID eid : 要素番号。非配列の場合は0を指定。 val : 代入する値 [実行後のstatの値] (0,1,2) = (成功,vid不正,eid不正) ■ mfx_compile 数式コードの生成 [書式] mfx_compile FSTR, TIVC,TRVC,CALCODE, INFO, ECODE FSTR : 文字列式 TIVC : TIVCを受け取る変数 TRVC : TRVCを受け取る変数 CALCODE : 計算コードを受け取る変数 INFO : 追加情報を受け取る変数 ECODE : エラーコードを受け取る変数 [追加情報] トークンの個数 [実行後のstatの値] (0,1) = (成功,エラーあり) [備考] エラーを発見すると直ちに処理を中断するので複数のエラーを同時に検出できない。 ■ mfx_decompile 正しい数式コードの逆コンパイル。 トークンレベルでのチェックしか行わない。 [書式] mfx_decompile FSTR, TIVC,TRVC,INFO, ECODE FSTR : 出力を受け取る変数 TIVC : TIVC TRVC : TRVC INFO : 追加情報を受け取る変数 ECODE : エラーコードを受け取る変数 [追加情報] トークンの個数 [実行後のstatの値] (0,1) = (成功,エラーあり) [エラーがある場合] ECODEに詳細情報が保存される。 エラーが発生したトークンのインデックスが要素(0)に保存される。 要素(1)にはエラーの原因が整数値で保存される。 0 : TIVCの型エラー 1 : TRVCの型エラー 2 : トークン数0 3 : TRVCのデータ欠損 10 : 不明なトークン 11 : 未知定数 12 : 未知変数 ■ mfx_GetTokenInfo トークン情報の取得。 正しい数式コードからトークン情報を読み出す。 [書式] mfx_GetTokenInfo TIVC,TRVC,tidx, TIV,TRV,STRTKN, ECODE TIVC : TIVC TRVC : TRVC tidx : トークンインデックス TIV : TIVを受け取る変数 TRV : TRV〃 STRTKN : 文字列に復元されたトークンを受け取る変数 ECODE : エラーコードを受け取る変数 [実行後のstatの値] (0,1) = (成功,エラーあり) [エラーコード] 0 : TIVCの型エラー 1 : TRVCの型エラー 2 : TIVCが空 3 : TRVCのデータ欠損 4 : tidx不正 5 : 未知変数 ■ mfx_calc 計算 [書式] mfx_calc x, TIVC,TRVC,CALCODE, ECODE, opt1 x : 結果を受け取る変数 TIVC : TIVC TRVC : TRVC CALCODE : CALCODE ECODE : エラーコードを受け取る変数 opt1 : 引数不正チェックスイッチ。(0,other)=(行わない,行う) [実行後のstatの値] (0,1,2,3,4) = (成功,数式にエラーあり,TIVC不正,TRVC不正,CALCODE不正) [エラーがある場合] ECODEに詳細情報が保存される。 詳しくは < エラーコード > を参照。 [備考] 引数不正チェックを行わない方が速くなる。 ■ mfx_common_IsFigure 与えられた文字列が10進数値を表すかどうか調べる [書式] mfx_common_IsFigure str str : 調べたい文字列を格納した変数 [実行後のstatの値] (0,1) = (数値を表さない,表す) ■ mfx_common_fig2str 与えられたdouble型実数を最大限正確に文字列化する [書式] mfx_common_fig2str buf,val,opt buf : 結果を受けとる変数 val : ターゲット opt : 小数位末尾0省略オプション ■ mfx_common_IsValidVarName 与えられた文字列が変数名として有効かどうか調べる [書式] mfx_common_IsValidVarName "変数名" [実行後のstatの値] (0,1) = (有効,無効) < エラーコード > < mfx_compile におけるエラーコード > エラーコードを格納する変数を E とすると、Eは要素数2の1次元整数型配列変数であり、 エラーコードは配列要素(0),(1)によって、2セクションに分けられている。 < 第1セクション > エラーが発見されたトークンのインデックス < 第2セクション > エラーの原因 0 : 式全体が空文字列である。 10 : 不明なトークン 11 : トークンが長すぎる 15 : そこに存在してはいけないトークンがある 16 : 式が正しく終わっていない 20 : (が閉じられていない 21 : )過多 30 : パラメータ不足 31 : パラメータ過多 40 : 配列でない変数に添え字が付いている 41 : 配列の添え字が無い 50 : その他 < mfx_calc におけるエラーコード > エラーコードを格納する変数を E とすると、Eは要素数3の1次元整数型配列変数であり、 エラーコードは配列要素(0),(1),(2)によって、3セクションに分けられている。 < 第1セクション > エラーが起こった部分のはじめのトークンのインデックス < 第2セクション > エラーが起こった部分のおわりのトークンのインデックス < 第3セクション > エラーの原因が整数値で格納される。 1 : 0除算 5 : 定義域逸脱 10 : 非整数によるビット演算 15 : 未定義変数への参照 16 : 配列の要素指定値が非整数 17 : 配列の確保済領域外への参照 ------------------------------------------------------------------------------------------------------------------------ < ライセンス > motchy が書いたソースコードと関連ファイルはMITライセンスに従います。 詳しくは LICENSE.txt を参照してください。 This software's source code and related files made by motchy are released under the MIT license, see LICENSE.txt. ------------------------------------------------------------------------------------------------------------------------ < 作者連絡先 > grepon8492@gmail.com 不具合等、お気付きの点がありましたらお気軽にご連絡ください。 但し、対処する保証はありません。 ------------------------------------------------------------------------------------------------------------------------ < 謝辞 > 手軽で多機能なプログラミング言語 Hot Soup Processor の開発者の皆様に感謝致します。 ------------------------------------------------------------------------------------------------------------------------ < 更新履歴 > 2015/08/23 ・atanhが常に0を返す不具合を修正 ・余りを正しく求められない不具合を修正