ページ 11

DxLibのGetRandについて教えて下さい

Posted: 2013年6月27日(木) 17:00
by 愛猫家
DxLibを始めたばかりなのですが、
http://dixq.net/g/03_07.html
に載っているサンプルプログラムでわからないところがありました(画像をランダムな方向に飛ばすプログラムです)。

angle = GetRand(10000)/10000.f * (PI*2); //0~PI*2の乱数を生成
speed = 0.5f + GetRand(10000)/10000.f * 2; //0.5~2.5の乱数を生成

という部分なのですが、
なぜ一旦0から10000までの乱数を得た後に10000.fで割って、さらに(PI*2)をかけているのですか??
たとえば
angle = GetRand(PI*2);
ではダメなのでしょうか?

また、10000.f や0.5f の’f’をつける意味がわかりません。

よければ是非お教えください。よろしくお願いします。

Re: DxLibのGetRandについて教えて下さい

Posted: 2013年6月27日(木) 17:11
by Blue
GetRand関数は0から引数に指定した整数を含むいずれかの整数が取得できるものです。

コード:

#define PI 3.1415926f
なので、PIは整数ではないですね。

10000.fにしているのは、そのまま10000にしておくとint型で計算されて、切り捨てされてしまうため、
明示的にfloat型として扱えるように接尾辞のfをつけてます。

Re: DxLibのGetRandについて教えて下さい

Posted: 2013年6月27日(木) 17:24
by Blue
追記

0.5fにしているのはspeedという変数がfloat型なので、無駄にキャスト処理が起こらないように
あらかじめfloat型として計算するようにしています。

>>speed = 0.5f + GetRand(10000)/10000.f * 2;
(float) = (float) + (int)/(float) * (int)

(int)/(float) -> (float)
(float) * (int) -> (float)

(float) + (float) -> (float)


0.5だとdouble型になる
(float) = (double) + (int)/(float) * (int)
(float) = (double) + (float)
[tab=30]= (double) + (double)(float) # ここはちょっと微妙・・・
[tab=30]= (double)

でdoubleをfloatにキャストする処理になる。

Re: DxLibのGetRandについて教えて下さい

Posted: 2013年6月28日(金) 01:51
by 愛猫家
>Blue さん

わかりやすくご回答くださり、ありがとうございます。

まずGetRandが整数を扱うものでしたね、頭から抜けていました…。
angleやspeedにおいては、float型であることを言うために'f'をつける必要があったということですね。
そしてfloat型の数字で、int型の数字を割ったり掛けたりしても、float型のまま、と。
理解しました。

ここで、なぜ0.5fはdouble型なのでしょうか?
0.5はただのスピードならば、float型ではないのでしょうか。素人考えですみません。
よろしければお教え下さい

Re: DxLibのGetRandについて教えて下さい

Posted: 2013年6月28日(金) 06:19
by non
愛猫家 さんが書きました:0.5はただのスピードならば、float型ではないのでしょうか。
0.5のように接尾語修飾しない場合はdouble型です。double型で計算した方がfloat型で計算するより
早いので、全部double型にした方がいいです。(と、私は理解している)
なぜ、Dixqさんがfloat型で計算されているのかは、知りません。

Re: DxLibのGetRandについて教えて下さい

Posted: 2013年6月28日(金) 17:20
by ISLe
一般的にはfloatよりdoubleのほうが速いですが、それはFPUが浮動小数点数を扱うモードはデフォルトで倍精度になっていて変換に時間がかかるという理由が大きいです。

Direct3D9のデバイスを初期化するとデフォルトで単精度モードに切り替わるので、doubleよりfloatのほうが速くなるはずです。
Direct3D9には精度を変更しない設定もありますが、その場合Direct3Dのパフォーマンスが落ちることになります。

Re: DxLibのGetRandについて教えて下さい

Posted: 2013年6月28日(金) 17:29
by non
ISLe さんが書きました:Direct3D9のデバイスを初期化するとデフォルトで単精度モードに切り替わるので、doubleよりfloatのほうが速くなるはずです。
そうですか。Dixqさんがわざわざ意味もなく、floatにしているはずはないですものね。