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’をつける意味がわかりません。
よければ是非お教えください。よろしくお願いします。
DxLibのGetRandについて教えて下さい
-
Blue
Re: DxLibのGetRandについて教えて下さい
追記
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にキャストする処理になる。
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について教えて下さい
>Blue さん
わかりやすくご回答くださり、ありがとうございます。
まずGetRandが整数を扱うものでしたね、頭から抜けていました…。
angleやspeedにおいては、float型であることを言うために'f'をつける必要があったということですね。
そしてfloat型の数字で、int型の数字を割ったり掛けたりしても、float型のまま、と。
理解しました。
ここで、なぜ0.5fはdouble型なのでしょうか?
0.5はただのスピードならば、float型ではないのでしょうか。素人考えですみません。
よろしければお教え下さい
わかりやすくご回答くださり、ありがとうございます。
まずGetRandが整数を扱うものでしたね、頭から抜けていました…。
angleやspeedにおいては、float型であることを言うために'f'をつける必要があったということですね。
そしてfloat型の数字で、int型の数字を割ったり掛けたりしても、float型のまま、と。
理解しました。
ここで、なぜ0.5fはdouble型なのでしょうか?
0.5はただのスピードならば、float型ではないのでしょうか。素人考えですみません。
よろしければお教え下さい
Re: DxLibのGetRandについて教えて下さい
0.5のように接尾語修飾しない場合はdouble型です。double型で計算した方がfloat型で計算するより愛猫家 さんが書きました:0.5はただのスピードならば、float型ではないのでしょうか。
早いので、全部double型にした方がいいです。(と、私は理解している)
なぜ、Dixqさんがfloat型で計算されているのかは、知りません。
non
Re: DxLibのGetRandについて教えて下さい
一般的にはfloatよりdoubleのほうが速いですが、それはFPUが浮動小数点数を扱うモードはデフォルトで倍精度になっていて変換に時間がかかるという理由が大きいです。
Direct3D9のデバイスを初期化するとデフォルトで単精度モードに切り替わるので、doubleよりfloatのほうが速くなるはずです。
Direct3D9には精度を変更しない設定もありますが、その場合Direct3Dのパフォーマンスが落ちることになります。
Direct3D9のデバイスを初期化するとデフォルトで単精度モードに切り替わるので、doubleよりfloatのほうが速くなるはずです。
Direct3D9には精度を変更しない設定もありますが、その場合Direct3Dのパフォーマンスが落ちることになります。
Re: DxLibのGetRandについて教えて下さい
そうですか。Dixqさんがわざわざ意味もなく、floatにしているはずはないですものね。ISLe さんが書きました:Direct3D9のデバイスを初期化するとデフォルトで単精度モードに切り替わるので、doubleよりfloatのほうが速くなるはずです。
non