收藏 分享(赏)

float精度问题.doc

上传人:gnk289057 文档编号:12400065 上传时间:2021-12-11 格式:DOC 页数:2 大小:31KB
下载 相关 举报
float精度问题.doc_第1页
第1页 / 共2页
float精度问题.doc_第2页
第2页 / 共2页
亲,该文档总共2页,全部预览完了,如果喜欢就下载吧!
资源描述

1、一般情况下,float 类型占 32 位,在内存中,从内存高位到内存低位,float 表示为:1 位符号位 + 8 位指数位 + 23 位尾数。比如 float 数 32.75,其计算方法如下:1) 先转化为二进制:100000.11;2) 移动小数点,直到整数部分为 1:小数点左移 5 位,1.0000011;3) 尾数:去掉正数部分,留下小数部分,不够 23 位的后面补 0,得到 0000011 00000000 000000004) 符号位: 0 表示正数,1 表示负数,这里为 0;5) 指数部分:左移为正,右移为负,这里是左移,所以指数值是 5。然后加上 127(做这个处理的原因暂时还

2、不是很明白,估计是要将负数转为正数),得到 132,再转化为二进制 10000100;最后,拼接起来就是 0 10000100 00000110000000000000000。如果要转化为十六进制,是42030000,在 X86 的机子里面就表示为 00 00 03 42。比如 float 数 0.0067,其计算方法如下:1) 先转化为二进制:0.000000011011011100010111010110;2) 移动小数点,直到整数部分为 1:小数点右移 8 位,1.1011011100010111010110;3) 尾数:去掉正数部分,留下小数部分,不够 23 位的后面补 0,得到 10

3、11011 10001011 101011004) 符号位: 0 表示正数,1 表示负数,这里为 0;5) 指数部分:左移为正,右移为负,这里是右移,所以指数值是 -8。然后加上 127(做这个处理的原因暂时还不是很明白,估计是要将负数转为正数),得到 119,再转化为二进制 1110111;最后,拼接起来就是 0 1110111 10110111000101110101100。如果要转化为十六进制,是3BDB8BAC,在 X86 的机子里面就表示为 AC 8B DB 3B。绝大部分的情况下,都有 1 位隐藏的高位“1” ,但是很接近 0 的数就不会有,因为指数可以表示的范围是 0 255,减

4、去 127,也就是-127 128,也就是最多右移 127 位,或者左移 128 位。如果右移了这么 127 位后也得不到 0,那么只能叹一句悲剧了,无可奈何。然后再看一个例子:0.45 ,先转化为二进制:0.0111001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011,会发现根本无法将其完全转化为二进制(我计算到 1000 位也没有终止),类似于无限小数。而尾数只有 23 位,所以精度问题就出来了。 0.45 最终只能表示为 0 01111101 110

5、01100110011001100110,化为十六进制 3EE66666,在 X86 的机子里面就表示为 66 66 E6 3E。再将 3EE66666 转化回来,得到 0.44999998807907104,显然精度损失了。所以说,float 类型能表示的十进制的精度是 log10(223) = 6.92,如果算上隐含的高位,就是 log10(224) = 7.22,也就是书上通常说的 6 7 位的由来了。由于存在精度问题,所以浮点数之间的比较有点特殊,不能按通常的做法进行。比如:float f = 0.45; / 在内存中存储的值由于精度损失,已经是0.44999998807907104f

6、loat p = f 0.45; / 输出 p,会发现不是 0,而是-0.00000001192092913271380900000000000所以两个浮点数之间的比较,以及浮点数和 0 之间的比较应该这么做:#define FLT_EPSILON 1.192092896e-07Ffabs(f1 f2) FLT_EPSILON其中 FLT_EPSILON 是参照 VS 的 float.h 中的定义的,其含义是“是 1.0 + x != 1.0 的最小正数” 。同样的,double 类型、long double 类型原理一样,也有相应的零界值:#define DBL_EPSILON 2.2204460492503131e-016

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报