浮点数在内存中的表示

清泛原创

写在前面:大家面试的时候可能会经常遇到考察浮点数与零比较的问题,是简单的 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;
}

运行结果:


好了,就写到这里,关于浮点数的核心内容大致就这些了,希望大家都能掌握,不断提升自己的水平。

浮点数 内存 补码 阶码 尾数

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部