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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
愛猫家

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

#1

投稿記事 by 愛猫家 » 12年前

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’をつける意味がわかりません。

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

Blue

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

#2

投稿記事 by Blue » 12年前

GetRand関数は0から引数に指定した整数を含むいずれかの整数が取得できるものです。

コード:

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

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

Blue

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

#3

投稿記事 by Blue » 12年前

追記

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について教えて下さい

#4

投稿記事 by 愛猫家 » 12年前

>Blue さん

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

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

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

non
記事: 1097
登録日時: 15年前

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

#5

投稿記事 by non » 12年前

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#6

投稿記事 by ISLe » 12年前

一般的にはfloatよりdoubleのほうが速いですが、それはFPUが浮動小数点数を扱うモードはデフォルトで倍精度になっていて変換に時間がかかるという理由が大きいです。

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

non
記事: 1097
登録日時: 15年前

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

#7

投稿記事 by non » 12年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る