我floats
用来代表我的游戏中的一个位置:
struct Position
{
float x;
float y;
};
我想知道这是否是最佳选择,以及随着位置值继续变大会产生什么后果。我花了一些时间来了解浮点数的存储方式,并意识到我有点困惑。
(我正在使用 Microsoft Visual C++ 编译器。)
在float.h
中,FLT_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
?