ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : 数値・数学演算

C++ で作成されたBREW アプリで、数値や数学関数を扱う方法です。
SophiaFramework を用いています。

RVCT for BREW 提供の数学関数を使用する

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 となる

参照 SFXHelper::wstrtofloat

      

文字列を整数に変換する

文字列を整数に変換するには、SFXAnsiString::AsSInt32SFXAnsiString::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::AsSInt32 | SFXAnsiString::AsUInt32

      

整数を文字列に変換する

整数を文字列に変換するには、SFXAnsiString::Format 関数を使用します。

SInt32 n = -2459;

SFXAnsiString str = SFXAnsiString::Format("%d", n);  // str = "-2459" となる

参照 SFXAnsiString::Format

      

浮動小数点型の数値を文字列に変換する

浮動小数点型の数値を文字列に変換するには、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();

参照 SFXHelper::floattowstr