前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

15.2. 数学演算

15.2.1. 乱数

SophiaFramework には、3 種類の乱数生成のためのクラスが用意されています。

SFXBrewRandom BREWの乱数生成関数を利用した乱数生成クラスです。
SFXLCGRandom 線形合同法 (LCG 法) により乱数を生成します。
SFXMTRandom Mersenne Twister (MT 法) により乱数を生成します。

使用法:SFXBrewRandom

SInt32 n1 = SFXBrewRandom::GetSInt32(); // 乱数を取得
// UINT32_MINIMUM 〜 UINT32_MAXIMUM の間の数

UInt08 n2 = SFXBrewRandom::GetUInt08(); // 乱数を取得
// 0 〜 UINT08_MAXIMUM の間の数

Float64 n3 = SFXBrewRandom::GetFloat64(); // 乱数を取得
// Float64 で考え得る数

Bool b = SFXBrewRandom::GetBool(); // true か false かをランダムに取得

// Bool b = static_cast<Bool>(SFXBrewRandom::GetUInt32() % 2);
// と書くよりも品質のよい乱数が得られる

各数値型に対応する乱数取得関数があります。

各関数で取得できる値の上限は 各型の最大値・最小値を表すマクロ を参照してください。

使用法:SFXLCGRandom

このクラスでは 48 ビットで乱数を発生させています。

アルゴリズムは UNIX の drand48 関数と同じですので、シードを同じにすると、drand48 と同じ乱数列を取得できます。

// シードを設定しない場合。
// シードは現在の時刻を元に設定される
SFXLCGRandom random;

SInt32 n1 = random.GetSInt32(); // 乱数を取得
// UINT32_MINIMUM 〜 UINT32_MAXIMUM の間の数

random.Randomize(3456); // シードを設定

UInt08 n2 = random.GetUInt08(); // 乱数を取得
// 0 〜 UINT08_MAXIMUM の間の数

使用法:SFXMTRandom

アルゴリズムは、メルセンヌ・ツイスター法オフィシャルのアルゴリズムと同じですので、シードを同じにすると、同じ乱数列を取得できます。

// シードを設定しない場合。
// シードは現在の時刻を元に設定される
SFXMTRandom random;

SInt32 n1 = random.GetSInt32(); // 乱数を取得
// UINT32_MINIMUM 〜 UINT32_MAXIMUM の間の数

random.Randomize(3456); // シードを設定

UInt08 n2 = random.GetUInt08(); // 乱数を取得
// 0 〜 UINT08_MAXIMUM の間の数

SFXLCGRandom の使用法と同じです。

[Note] メモリの消費

SFXMTRandom クラスは 2.5K バイトほどのメモリを消費しますので、スタックが足りない場合はヒープ上にインスタンスを作成してください。

15.2.2. 高速な三角関数演算

SFXTrigonometric クラスは三角関数テーブルを用いて高速に三角関数演算を行うためのクラスです。

使用法

SFXTrigonometric table;

// 三角関数テーブルを初期化
// この部分は時間がかかる

table.Initialize();

SInt32 i;
for (i = 0; i < 1000; ++i) { // 回数の多いループ

    // 三角関数の計算 (この部分は高速)

    Float64 n1 = table.Sin(i);
    Float64 n2 = table.Cos(i);
    Float64 n3 = table.Tan(i);

   // n1, n2, n3 の使用...

}

SFXTrigonometric クラスには度数法と弧度法の変換関数も用意されています。

Float64 n1 = SFXTrigonometric::DegreeToRadian(180); // n1 は 3.1415... になる
Float64 n2 = SFXTrigonometric::RadianToDegree(6.2831); // n2 は 359.99... になる

15.2.3. RVCTB 提供数学関数の使用

SophiaFramework は標準的な浮動小数点演算を行うことができます。加えて、RVCTB が提供する以下の数学関数を使用することができます。

// マクロ (各マクロの具体的な値はコンパイラによって異なる場合があります)
HUGE_VAL
INFINITY
NAN


// 関数
Float64 acos(Float64)
Float64 asin(Float64)
Float64 atan(Float64)
Float64 atan2(Float64, Float64)
Float64 cos(Float64)
Float64 sin(Float64)
Void __use_accurate_range_reduction(Void) // VC++ では使用できません
Float64 tan(Float64)
Float64 cosh(Float64)
Float64 sinh(Float64)
Float64 tanh(Float64)
Float64 exp(Float64)
Float64 frexp(Float64, int*)
Float64 ldexp(Float64, int)
Float64 log(Float64)
Float64 log10(Float64)
Float64 modf(Float64, Float64Ptr)
Float64 pow(Float64, Float64)
Float64 sqrt(Float64)
Float64 _sqrt(Float64)               // VC++ では sqrt(Float64) を使用してください
Float32 _sqrtf(Float32)              // VC++ では sqrtf(Float64) を使用してください
Float64 ceil(Float64)
Float64 fabs(Float64)
Float32 _fabsf(Float32)              // VC++ では fabsf(Float32) を使用してください
Float32 fabsf(Float32)
Float64 floor(Float64)
Float64 fmod(Float64, Float64)
Float64 acosh(Float64)               // VC++ では使用できません
Float64 asinh(Float64)               // VC++ では使用できません
Float64 atanh(Float64)               // VC++ では使用できません
Float64 cbrt(Float64)                // VC++ では使用できません
Float64 copysign(Float64, Float64)   // VC++ では float.h をインクルードして
                                     // _copysign(Float64, Float64) を使用してください
Float64 erf(Float64)                 // VC++ では使用できません
Float64 erfc(Float64)                // VC++ では使用できません
Float64 expm1(Float64)               // VC++ では使用できません
Float64 finite(Float64)              // VC++ では float.h をインクルードして
                                     // _finite(Float64) を使用してください
Float64 gamma(Float64)               // VC++ では使用できません
Float64 gamma_r(Float64, int*)       // VC++ では使用できません
Float64 hypot(Float64, Float64)
int ilogb(Float64)                   // VC++ では使用できません
Float64 isnan(Float64)               // VC++ では float.h をインクルードして
                                     // _isnan(Float64) を使用してください
Float64 j0(Float64)                  // VC++ では _j0(Float64) を使用してください
Float64 j1(Float64)                  // VC++ では _j1(Float64) を使用してください
Float64 jn(int, Float64)             // VC++ では _jn(int, Float64) を使用してください
Float64 lgamma(Float64)              // VC++ では使用できません
Float64 lgamma_r(Float64, int*)      // VC++ では使用できません
Float64 log1p(Float64)               // VC++ では使用できません
Float64 logb(Float64)                // VC++ では使用できません
Float64 nextafter(Float64, Float64)  // VC++ では float.h をインクルードして
                                     // _nextafter(Float64, Float64) を使用してください
Float64 remainder(Float64, Float64)  // VC++ では使用できません
Float64 rint(Float64)                // VC++ では使用できません
Float64 scalb(Float64, Float64)      // VC++ では float.h をインクルードして
                                     // _scalb(Float64, SInt32) を使用してください
Float64 scalbn(Float64, int)         // VC++ では float.h をインクルードして
                                     // _sclab(Float64, SInt32) を使用してください
Float64 significand(Float64)         // VC++ では使用できません
Float64 y0(Float64)                  // VC++ では _y0(Float64) を使用してください
Float64 y1(Float64)                  // VC++ では _y1(Float64) を使用してください
Float64 yn(int, Float64)             // VC++ では _yn(int, Float64) を使用してください

// C++ 環境用に提供されている関数
Float64 abs(Float64)
Float32 abs(Float32)
Float32 acos(Float32)
Float32 asin(Float32)
Float32 atan(Float32)
Float32 atan2(Float32, Float32)
Float32 ceil(Float32)
Float32 cos(Float32)
Float32 cosh(Float32)
Float32 exp(Float32)
Float32 fabs(Float32)
Float32 floor(Float32)
Float32 fmod(Float32, Float32)
Float32 frexp(Float32, int*)
Float32 ldexp(Float32, int)
Float32 log(Float32)
Float32 log10(Float32)
Float32 modf(Float32, Float32Ptr)
Float32 pow(Float32, Float32)
Float32 pow(Float32, int)
Float32 sin(Float32)
Float32 sinh(Float32)
Float32 sqrt(Float32)
Float32 _sqrt(Float32)                // VC++ では sqrt(Float32) を使用してください
Float32 tan(Float32)
Float32 tanh(Float32)
Float64 pow(Float64, int)

これらの関数を使用するために math.h ヘッダをインクルードする必要はありません。