前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

20.2. 数学演算

20.2.1. 乱数クラス

乱数クラスは 3 種類あります。

表 20.1. 乱数クラス

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

SFXBrewRandom クラスは、 BREW の乱数生成関数により乱数を生成するクラスです。

このクラスは、 内部で BREW API GETRAND 関数を呼び出して乱数を発生させます。

Bool、Float32、Float 64、SInt08、SInt16、SInt32、UInt08、UInt16、UInt32 などの各数値型に対応した乱数生成関数があります。

各関数で生成できる乱数の上限値と下限値は、 最大値・最小値を表すマクロを参照してください。

例 20.2. SFXBrewRandom の使用方法

// SINT32_MINIMUM 〜 SINT32_MAXIMUM の間の乱数を生成する
SInt32 n1 = SFXBrewRandom::GetSInt32();   

// 0 〜 UINT08_MAXIMUM の間の乱数を生成する
UInt08 n2 = SFXBrewRandom::GetUInt08(); 

// 0 以上 1 未満の Float64 型浮動小数の乱数を生成する
Float64 n3 = SFXBrewRandom::GetFloat64(); 

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

SFXLCGRandom クラスは、 UNIX の drand48 関数と同じアルゴリズムを使用して 48 ビットの乱数を生成するクラスです。

同じシードからは、同じ乱数列が生成されます。

例 20.3. SFXLCGRandom の使用方法

// コンストラクタの引数にシードを指定しない場合は、
// デバイスに電源が投入されてからの経過時間(ミリ秒)がシードになる
SFXLCGRandom random;

// SINT32_MINIMUM 〜 SINT32_MAXIMUM の間の SInt32 型の乱数を生成する
SInt32 n1 = random.GetSInt32(); 

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

// 0 〜 UINT08_MAXIMUM の間の UInt08 型の乱数を生成する
UInt08 n2 = random.GetUInt08();

SFXMTRandom クラスは、 メルセンヌ・ツイスター法のアルゴリズムを使用して乱数を生成するクラスです。

同じシードからは、同じ乱数列が生成されます。

[Note] 注意
SFXMTRandom クラスの使用方法は、 SFXLCGRandom クラスと同じです。

例 20.4. SFXMTRandom の使用方法

// コンストラクタの引数にシードを指定しない場合は、
// デバイスに電源が投入されてからの経過時間(ミリ秒)がシードになる
SFXMTRandom random;

// SINT32_MINIMUM 〜 SINT32_MAXIMUM の間の SInt32 型の乱数を生成する
SInt32 n1 = random.GetSInt32(); 

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

// 0 〜 UINT08_MAXIMUM の間の UInt08 型の乱数を生成する
UInt08 n2 = random.GetUInt08();
[Tip] スタック容量が不足する場合

SFXMTRandom インスタンスは、 2.5 K バイト程度のメモリを消費します。 スタック容量が不足する場合は、 ヒープ上に SFXMTRandom インスタンスを作成します。

20.2.2. 三角関数クラス

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

例 20.5. 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 クラスには、 度数法と弧度法の変換関数も用意されています。

例 20.6. 度数法と弧度法の変換関数

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

20.2.3. 浮動小数点演算

SophiaFramework UNIVERSE では、 標準 BREW では利用できない浮動小数点演算や 各種コンパイラの math.h で定義されている数学関数を利用できます。

[Tip] math.h のインクルード

SFCCondition.h.hpp 内でインクルード済みなので math.h のインクルードは不要です。

例えば、ARM RealView Compilation Tools for BREW 1.2 で利用可能な数学関数は以下の通りです。

例 20.7. ARM RealView Compilation Tools for BREW 1.2 で利用できる数学関数

// マクロ
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)