RVCT for BREW 提供の数学関数を使用する
SophiaFrameworkでは RVCT for BREW 提供の数学関数が利用可能です。
詳しくはリファレンス「RVCTB 提供数学関数の使用」を参照してください。
C++ で作成されたBREW アプリで、数値や数学関数を扱う方法です。
SophiaFramework を用いています。
SophiaFrameworkでは RVCT for BREW 提供の数学関数が利用可能です。
詳しくはリファレンス「RVCTB 提供数学関数の使用」を参照してください。
SophiaFramework は、BREWネイティブ、線形合同法、メルセンヌ ツイスター法の3種類の乱数クラスを提供します。
■ BREW ネイティブ( SFXBrewRandom クラス ) : BREW API である GETRAND() 関数を使って乱数を発生させるクラスです。
// 用意されている static 関数を使って乱数を生成する SInt32 n1 = SFXBrewRandom::GetSInt32(); // ※ SInt32 以外の型の乱数を生成する関数も用意されている
■ 線形合同法( SFXLCGRandom クラス ) : 線形合同法を用いて 48 ビットで乱数を発生させるクラスです。アルゴリズムは UNIX の drand48() 関数と同等です。BREW ネイティブ( SFXBrewRandom クラス )と異なり、同じシードを使用すれば、同じ乱数列を取得できます。
// 乱数列の seed はコンストラクタの引数として渡す SFXLCGRandom rand2(3245); // 乱数を生成する SInt32 n3 = rand2.GetSInt32(); // コンストラクタの引数を指定しない場合、時刻が乱数列の seed となる SFXLCGRandom rand; // 乱数を生成する SInt32 n2 = rand.GetSInt32();
■ メルセンヌ ツイスター法 ( SFXMTRandom クラス ) : メルセンヌ・ツイスター法のアルゴリズムを使って乱数を発生させるクラスです。BREW ネイティブ( SFXBrewRandom クラス )と異なり、同じシードを使用すれば、同じ乱数列を取得できます。
※ ローカル変数として SFXMTRandom クラスのインスタンスを作成する場合、2.5K バイトほどのスタックを消費します。スタックの容量が不足する場合はヒープ上にインスタンスを作成します。
// 乱数列の seed はコンストラクタの引数として渡す SFXMTRandom rand2(3245); // 乱数を生成する SInt32 n5 = rand2.GetSInt32(); // コンストラクタの引数を指定しない場合、時刻が乱数列の seed となる SFXMTRandom rand; // 乱数を生成する SInt32 n4 = rand.GetSInt32();
参照 SFXBrewRandom::GetSInt32 | SFXLCGRandom::GetSInt32 |
SFXMTRandom::GetSInt32
SFXTrigonometric クラスは三角関数テーブルを用いて高速に三角関数演算を行うためのクラスです。
最初に、SFXTrigonometric クラスを初期化し、任意の精度の三角関数テーブルを作成します。そして sin, cos, tan などの三角関数演算を行います。
三角関数テーブルの初期化時は精度を上げると初期化に時間がかかります。逆に、精度を下げると初期化は短時間で終わります。
sin, cos, tan の演算時に浮動小数点演算が行われないで、高速な三角関数演算を実現できます。
以下に使用例を示します。
■ SFXTrigonometric クラスの使用方法Void SFXMathematicsExplainer::_SFXTrigonometric(Void) const { SFXTrigonometric tri; SInt16 i; Float64 temp; // 三角関数テーブルを初期化する( 時間がかかる処理 ) if (tri.Initialize() == SFERR_NO_ERROR) { for (i = 0; i < 10; ++i) { // 三角関数テーブルを使って sin 値を計算する // PI : 円周率 temp = tri.Sin(i * 9 * PI / 180); TRACE("%d", static_cast(temp * 10000.0)); } // メモリを明示的に解放する tri.Terminate(); } // 三角関数テーブルを分割数を 45 と指定して初期化する方法: // ( 分割数を指定しない場合、デフォルトの分割数は 90 ) // 分割数 90 の場合よりも精度が劣化するが、初期化は高速化する if (tri.Initialize(45) == SFERR_NO_ERROR) { for (i = 0; i < 10; ++i) { // 三角関数テーブルを使って sin 値を計算する // PI : 円周率 temp = tri.Sin(i * 9 * PI / 180); TRACE("%d", static_cast (temp * 10000.0)); } // メモリを明示的に解放する tri.Terminate(); } // SFXTrigonometric クラスでは、sin 以外に // cos と tan の値が計算可能 return; }
参照 SFXTrigonometric::Initialize | SFXTrigonometric::Sin |
SFXTrigonometric::Cos | SFXTrigonometric::Tan |
SFXTrigonometric::Terminate
文字列を浮動小数点に変換するには、SFXHelper::wstrtofloat 関数を使用します。
SFXWideString str = "1.234"; // 変換したい文字列 Float64 value = SFXHelper::wstrtofloat(str.GetCString()); // value = 1.234 となる
文字列を整数に変換するには、SFXAnsiString::AsSInt32、SFXAnsiString::AsUInt32 関数を使用します。
引数は変換に失敗した際、代入される数です。
SFXAnsiString str("-352"); SInt32 n; UInt32 un; n = str.AsSInt32(0); // n は -352 str = "4000000000"; un = str.AsUInt32(0); // un は 4000000000 str = "35xyz"; n = str.AsSInt32(0); // n は 35 str = "72.847"; n = str.AsSInt32(0); // n は 72 str = "xyz59"; n = str.AsSInt32(0); // 変換失敗なので n は 0
整数を文字列に変換するには、SFXAnsiString::Format 関数を使用します。
SInt32 n = -2459; SFXAnsiString str = SFXAnsiString::Format("%d", n); // str = "-2459" となる
浮動小数点型の数値を文字列に変換するには、SFXHelper::floattowstr 関数を使用します。
変換後、空白部分(0x20) が残るので SFXAnsiString::Trim 関数にて削除します。
Float64 x = 3.14159; // 変換対象の変数. Float32 でも可 WChar buf[30]; SFXHelper::floattowstr(x, buf, sizeof(buf)); // buf = " 3.14159" となる SFXAnsiString string; // 文字列を代入する変数 // 空白部分(0x20)削除 string = buf; string = string.Trim();