还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

浮点数在内存中的表示

来源:清泛原创     2015-08-10 16:42:31    人气:     我有话说( 0 人参与)

一般我们常见的字符型、整型在内存中采用标准的二进制存储,但是程序员往往容易忽略浮点数在内存中的储存方式,从而会导致一些误用,最常见的是浮点数等于零的判断。只有理解了浮点数内存的表示方式我们才能正确的使用它。

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

运行结果:


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

浮点数 内存 补码 阶码 尾数

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)
分享到: