Mod_fx 使用ガイド


Mod_fxの使い方を、実際のコードを交えて説明します。
このモジュールを初めて使う方は是非ご覧ください。

尚、「説明.txt」で説明されていることの説明は省いています。本書を読む前に、「説明.txt」を軽く読んでおくと本書の内容の理解が楽になります。
本書を読む時は、必要に応じて「説明.txt」を読んでください。

〜index〜


> 数式文字列 (文字列で記述された式) の値を求める操作の流れ

> @ モジュールの初期化
> A コンパイル 〜数式文字列から中間コードを生成する〜
> B 変数に値を代入する
> C 中間コードを使って式の値を求める

 

> 一般的な操作

> 変数の内容を参照する
> 64bit倍精度の実数値を最大限正確に小数表示する

 

> 特別な操作

> 中間コードから数式文字列を生成する

 

数式文字列 (文字列で記述された式) の値を求める操作の流れ
画像を表示できません

今回は実習として、

画像を表示できません

という関数について、 f(-47) の値を求めて、結果を表示してみましょう。
この関数を本モジュールの扱える形で表現すると、

x*x + 4*x - 8

となります。

スクリプトは以下の例のようになります。
このスクリプトについて詳しく説明していきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     ;必要なファイルのインクルード
     #include "mod_CharStr.as"
     #include "mod_fx.as"
   
     ;数式文字列の準備
     formula = "x*x + 4*x - 8"
   
     ;モジュールの初期化
     Mfx_init
  
     ;中間コードの生成
     Mfx_compile formula ,SymbolCode ,FigureCode ,ErrorCode1
  
     ;変数値リストを作成
     ddim VarValueList,52
   
     ;変数に値を代入
     Mfx_substitute VarValueList,"x",-47.0
   
     ;中間コードに従って計算させる
     k = Mfx_calc(SymbolCode ,FigureCode ,VarValueList ,ErrorCode2)
   
     ;結果を表示する
     mes MCS_DoubleToStr64(k)

@ モジュールの初期化
画像を表示できません

HSPランタイムの起動後、初めて本モジュールを使用するときには、初期化を行う必要があります。
初期化とは、本モジュールの機能を使用可能な状態にするための処理です。
このための命令が「Mfx_init」です。

9行目でこれを呼び出しています。

 

A コンパイル 〜数式文字列から中間コードを生成する〜
画像を表示できません

中間コードを生成します。
そのための命令が「Mfx_compile」です。

書式は

Mfx_compile 文字列1,変数名1,変数名2,変数名3

文字列1 : 未整形文字列式。(※変数名も可)
変数名1 : シンボルコードの保存先の変数の名前。(初期化しておかなくてもよい)
変数名2 : フィギュアコードの保存先の変数の名前。(初期化しておかなくてもよい)
変数名3 : エラーコードを格納する変数。要素数3の一次元整数型配列変数として初期化される。(初期化しておかなくてもよい)

です。

12行目でこの命令を呼び出しています。
変数1,2,3は事前に初期化する必要がないので、未初期化のまま名前をパラメータとして渡しています。
今回は
シンボルコードの格納に「SymbolCode」変数、
フィギュアコードの格納に「FigureCode」変数、
エラーコードの格納に「ErrorCode1」変数
を使用しています。

 

B 変数に値を代入する
画像を表示できません

f(-47)の値を求めるので、 x = -47 にすることを考えます。

まず変数値リストを作成します。これは要素0〜51まで確保された一次元実数型配列変数です。
15行目で「VarValueList」変数を変数値リストの格納用として初期化しています。
初期化直後はすべての変数の値が0になります。


そして x に -47 を代入します。
Mfx_substitute」命令を使います。
18行目で代入を行っています。
第三パラメータで -47.0 として実数を渡していますが、与えられた数の型に関わらず、内部で実数に変換していますので、 -47 として整数を渡してもかまいません

実は、「Mfx_substitute」命令を使用せずに値を代入することも可能です。
今回の場合は、18行目を
VarValueList(23) = -47.0
で置き換えても正常に動作します。さらに、置き換えた場合の方が、僅かですが処理は速いです。
詳しくは「説明.txt」の「Mfx_substitute」命令の項目を読んでください。

 

C 中間コードを処理して式の値を求める
画像を表示できません

必要なものはそろいました。
Mfx_calc」関数でf(-47)の値を求めましょう。

21行目で、計算結果を k変数 に保存しています。
画面には 2013.000000000000 と表示されているはずです。

 

一般的な操作
画像を表示できません

変数の内容を参照する
画像を表示できません

変数値リストを参照し、ある変数に代入されている値を調べるには「Mfx_SeeVarValue」関数を使います。

例えば、変数値リストを「VarValueList」変数とし、cにランダムな値を代入した後、その内容を参照するスクリプトの例は以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
     ;必要なファイルのインクルード
     #include "mod_CharStr.as"
     #include "mod_fx.as"
   
     randomize
   
     ;モジュールの初期化
      Mfx_init
    
     ;変数値リストを作成
     ddim VarValueList,52
   
     ;変数に値を代入
     Mfx_substitute VarValueList,"c",rnd(999)
   
     ;変数に代入されている値を取得する。
     k = Mfx_SeeVarValue(VarValueList,"c",ErrorCode1)
 
     mes k

17行目で c に代入されている値を k に取得しています。


実は、「Mfx_SeeVarValue」関数を使用せずに値を調べることもできます。
今回の場合は17行目を
k = VarValueList(2)
で置き換えても正常に動作します。さらに、置き換えた場合の方が、僅かですが処理が速いです。
詳しくは「説明.txt」の「Mfx_SeeVarValue」命令の項目を読んでください。

 

64bit倍精度の実数値を最大限正確に小数表示する
画像を表示できません

HSPで扱う実数値は64bit倍精度で、有効数字は 17ケタ であるようです。
従って、例えば整数位で4ケタを消費すれば小数位で使用できるのは 17-4 = 13ケタ となります。
正・負関係なくこのようになります。

k = 1.2345678910111213

とすると、整数位で1ケタ、小数位で16ケタ使っているのでこれで限界まで記憶領域を使っています。

mes k

とするとどうなるでしょうか?

1.234568

と表示されます。小数位が6ケタ目までしか表示されていません。しかも小数第7位が四捨五入された結果
第6位が 7 から 8 へ変わっています。

もっと正確に表示するには、「strf」関数(HSP標準関関数)を使いますが、整数位の桁数を求めて小数位からの読み出し文字数を決める処理をしなくてはなりません。

本モジュールが依存するモジュール「Mod_CharStr」には「MCS_DoubleToStr64」関数が用意されています。
この関数は内部でstrf関数を使用しており、その他の計算を自動で行っています。
これを使えば64bit倍精度の実数値を正確に文字列として表せます。

今回の場合は

mes MCS_DoubleToStr64(k)

とすることで

1.2345678910111213

と表示することができます。

 

特別な操作
画像を表示できません

中間コードから数式文字列を生成する
画像を表示できません

コンパイル後に、中間コードから数式文字列を生成するには、「Mfx_ICodeToStrFormula」関数を使います。
使い方は 「説明」.txt を参照してください。

与えられた中間コードの単語エラーチェックは行われますが、文法エラーチェックは行われません。注意してください。