Lin*_*cer 47
要了解它们的存储方式,您必须首先了解它们的含义以及它们要处理的值.
与整数不同,浮点值旨在表示极小的值以及极大的值.对于正常的32位浮点值,这对应于1.175494351*10 ^ -38到3.40282347*10 ^ + 38范围内的值.
显然,仅使用32位,不可能以这样的数字存储每个数字.
当涉及到表示时,您可以将所有正常的浮点数看作1.0到(几乎)2.0范围内的值,以2的幂进行缩放.所以1.0就是1.0*2 ^ 0.2.0是1.0*2 ^ 1.-5.0是-1.25*2 ^ 2.
那么,需要尽可能有效地对此进行编码吗?我们真正需要什么?
根据IEEE-754浮点标准,其编码如下.
除了正常的浮点值之外,还有许多特殊值:
最后,以下是一些具体示例(所有值均为十六进制):
typedef struct {
unsigned int mantissa_low:32;
unsigned int mantissa_high:20;
unsigned int exponent:11;
unsigned int sign:1;
} tDoubleStruct;
double a = 1.2;
tDoubleStruct* b = reinterpret_cast<tDoubleStruct*>(&a);
Run Code Online (Sandbox Code Playgroud)
如果编译器使用IEEE 754双精度(这是当今大多数系统上C双精度的默认值),那么如何设置内存就是一个例子.
这里是基于C的二进制形式,更好地阅读 维基百科有关双精度的理解.