1

floatsゲーム内の位置を表すために使用しています:

struct Position
{
    float x;
    float y;
};

これが最良の選択であるかどうか、そしてポジションの値が大きくなり続けるにつれてどのような結果になるか疑問に思っています. フロートの保管方法をブラッシュアップするのに時間がかかり、少し混乱していることに気付きました。

(Microsoft Visual C++ コンパイラを使用しています。)

ではfloat.hFLT_MAX次のように定義されています。

#define FLT_MAX         3.402823466e+38F        /* max value */

です340282346600000000000000000000000000000

UINT_MAXその値は、次のように定義されている値よりもはるかに大きくなります。

#define UINT_MAX        0xffffffff

値 に対応します4294967295

これに基づいてfloat、位置のような非常に大きな数を格納するのは良い選択だと思われます。非常に大きいですFLT_MAXが、精度の問題がどのように発生するのか疑問に思っています。

私の理解に基づいて、afloatは符号を格納するために 1 ビットを使用し、指数を格納するために 8 ビットを使用し、仮数を格納するために 23 ビットを使用します (先行する 1 が想定されます)。

    S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM

つまりFLT_MAX、次のようになります。

    0 11111111 11111111111111111111111

これは次のようになります:

1.11111111111111111111111 x 2^128

また

111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

これを知っていても、精度の低下を視覚化するのに苦労し、値が増加し続けるとどうなるかを考えて混乱しています.

これを考える簡単な方法はありますか?floatsまたはdoubles一般に、のようなものに非常に大きな数を格納するために使用されunsigned intますか?

4

4 に答える 4

3

float の精度についての考え方は、おおよそ 5 桁の精度があると考えることです。したがって、単位がメートルで、1 km 離れたところに何かがある場合、それは 1000 m です。10 cm (0.1 m) 以下の解像度でそのオブジェクトを処理しようとすると、問題が発生する可能性があります。

ゲームでの通常のアプローチは、フロートを使用することですが、位置がローカル座標系に相対的になるようにワールドを分割します (たとえば、ワールドをグリッドに分割し、各グリッドの正方形に平行移動値を設定します)。 . レンダリングのためにカメラに対して変換されるまでは、すべてが十分な精度を持っています。その時点で、遠くのものの不正確さは問題になりません。

例として、太陽系を舞台にしたゲームを想像してみてください。座標系の原点が太陽の中心にある場合、惑星の表面の座標を float で正確に表現することは不可能です。ただし、代わりに、惑星の表面に対する座標系があり、惑星の中心に対する座標系があり、惑星が太陽に対して相対的な場所を知っている場合、ローカル空間で物事を操作できますレンダリングに必要な空間に変換します。

于 2012-12-06T12:08:20.090 に答える
0

いいえ、そうではないです。

ゲーム オブジェクトが移動してから、特定のフレームで位置を 10 cm 増やす必要があるとします。

メートル単位でスケーリングされたゲームの世界を想定すると、これは 0.10 です。しかし、float値が十分に大きい場合、0.10 の差を表すことができなくなり、値を大きくしようとしても失敗します。

于 2012-12-06T12:04:04.237 に答える
0

小数部分で 16.7m より大きい値を格納する必要がありますか? その場合、フロートが小さすぎます。

Bruce Dawson によるこのシリーズが役立つかもしれません

于 2012-12-06T12:05:10.787 に答える
0

非常に大きな数を処理する必要がある場合は、任意精度の算術ライブラリの使用を検討してください。これらのライブラリは組み込み型の演算よりも遅いため、コードをプロファイリングする必要があります。

非常に大きな座標値が実際には必要ない可能性があります。たとえば、ワールドの端をラップして、モジュロ演算を使用して位置を処理することができます。

于 2012-12-06T12:09:21.120 に答える