浮点数在内存中的表示
清泛原创
写在前面:大家面试的时候可能会经常遇到考察浮点数与零比较的问题,是简单的 f == 0 吗?当然不是,正确的写法应该是f > -1e-7 && f < 1e-7,为什么呢?
浮点型,由于精度关系(float精度:2^23 = 8388608,一共7位,同理double 16位),最小分辨0.0000001, 当存储一个数时,只有7位是准确的,比如存储0,可能在内存中的值为0.00000001321。。。。。 所以判断浮点型的0值最好用fabs(i) < 0.0000001
如:125.5 = 1111101.1(1.1111011*2^6),三个段分别为 0, 10000101(127+6=133), 11110110000000000000000
下面提供一个Demo,大家有兴趣的话可以直接修改自行验证其他的例子:
#include "stdafx.h"
#include <string.h>
#include <limits>
int _tmain(int argc, _TCHAR* argv[])
{
float f1 = FLT_MIN;
printf("%f\n", f1);
f1 = FLT_MAX;
printf("%f\n", f1);
// 0 10000101 11110110000000000000000
void * p = (void *)0x42fb0000;
memcpy(&f1, &p, 4);
printf("%f\n", f1);
// 1 11111111 00000000000000000000000
p = (void *)0xff800000;
memcpy(&f1, &p, 4);
printf("%f\n", f1);
return 0;
}
运行结果:
好了,就写到这里,关于浮点数的核心内容大致就这些了,希望大家都能掌握,不断提升自己的水平。