首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

float会精确表示的最大数字是多少

2013-01-06 
float能精确表示的最大数字是多少这个文法有点失误,容我解释。现在限定这个最大数字为不带指数的整数,如123

float能精确表示的最大数字是多少
这个文法有点失误,容我解释。现在限定这个最大数字为不带指数的整数,如123456789. 

我的问题是,float的尾数为23位,加上隐含的一位整数位是24位。那么能精确表示的最大数字应该是2^24 - 1 = 16777215,
但是我将float变量赋予大于16777215的值22345678,为什么依然能精确输出这个值?
[解决办法]
根据IEEE浮点数表示法:
V = (-1)^s * M * 2^E.
其中s为符号位,M为尾数,E是阶码。
---------------------------------------
现在你是想找出浮点表示法不能精确表示的正整数是吧。
我们来观察IEEE表示法:
首先排除非规格化的值,因为非规格化的值只能表示<1的数。
再来看规格化的值(位方便讨论,不考虑符号位):
M * 2^E相当于对M进行移位处理,移位处理是不会增加1的个数的
因此我们需要的这个整数的第一个1到最后一个1的距离必须大于M首尾的距离
假设有n个尾数位(M = 1 + n个尾数位所表示的小数),那么这个最小的整数值就是10000(n个0)1,也就是2^(n + 1) + 1.
------------------------------
综上所述,IEEE表示法不能精确表示的正整数有以下特点:
首尾两个1的距离大于(n+1)。
---------------------------------------
我们再来看你给的那个数字
22345678 = 1010101001111011111001110.
很明显这个数字可以这样分解:
M = 1 + 0.01010100111101111100111
E = 24
V = M * 2^E
因为首尾两个1之间的距离等于24,而不是大于24.

热点排行