陈丹青的婚姻:float 精度

来源:百度文库 编辑:九乡新闻网 时间:2024/07/07 13:27:52
精度是指正确的有效数字,小数点后6位有错的;exp:float a = 3333.4444444444444;printf("%f\n",a) 输出: 3333.4445233333.444 是正确的;0.444523是错误的;linux gcc 精度是 7   这个精度是指   有效数字,而不单指小数点后的位数。
至于精度是   6,   是指   最坏情况下,保持的精度至少有   6   位。

这是因为,IEEE标准的   float   类型用   23   bit   来表示浮点数的小数部分。
极限情况下(这时没有使用隐含的高位),这里所能表示的   10   进制的精度是   log10(2^23)   =   6.92...
所以最小也能保持   6   位的精度。
============================

至于楼主所说的情形,是因为你的那种情况不是极限情形。
实际上,浮点数的存储形式是类似于:    
      数字   *   2^(幂)
的形式的。
而   123456.789098765678  
    表示成   1.111   0001   0010   0000   0110   0101   *   2^(16)   的--   *前的是2进制。
不信可以自己算算,将那个   2   进制转成   10   进制,然后   16次   乘   2   ,看结果是否如此。
这里小数点前的   1   是隐含的,实际存储的只有小数点后的数,就是   23   bit。

可以说,能够保留到   10   位完全是数字本身的结构,比较幸运了。
你甚至试试  
float   x   =   0.000000000931322574615478515625;   //   2^-30
然后用   printf( "%.35f\n ",   x);看看,这里甚至完全保持原来的精度,
这就是数字本身的特殊结构所导致的。
再试试   999989.98   看看,精度还有没有   10位了。
==========================================

实际上,绝大部分情况(除了很接近0的数),都是使用   一位隐含的高位   的,
这时的精度是   log10(2^24)   =   7.22
所以也有的书也说   float   的精度是   7   位---   比如我刚学   C   时所看的那本……