关于浮点型的有效数字和精度的问题

不是说float和double都是7位精度么?那为什么可以精确到小数点后更多的位数?默认的精度是6位,那7位精度是什么意思啊?

有效数字是从左边第一位不为0的数开始算么?float型是7位有效数字,那是不是输入更多的数字时它都只能显示7位呢?

*****你提的5个问题,给你分别简单分析一下.

*****对于精度是6位或7位的问题,float型(4字节32位)精度确实是6位或7位,而double型(8字节64位)精度是15或16位. 你可以具体测试一下:
float m_float = 123.45678 ;
double m_double = 1234567890.1234567 ;
cout << "m_float = " << m_float << endl ;
cout << "m_double= " << m_double<< endl ;
结果是不是:m_float = 123.4568 ; // 有的机器估计是123.457
*****m_float = 1234567890.123457 ; /* 有的机器估计是1234567890.12346 */

*****对于“那是不是输入更多的数字时它都只能显示7位呢?”的说法,“显示”一词说得不恰当,你输入再多的数字,在进入float或double内存的四个字节后都将被截短. 你再调用这个float变量时它已经丢失了过量的精度,并不是什么显示问题.

*****其实浮点型的输入值iFloat在存入内存前,由硬件做了一个系列操作. 首先计算出唯一的n值,使得 2^n <= iFloat <= 2^(n+1). 然后用iFloat除于2^n得到一个大于1小于2的小数decimal. 对于float型,用其中的最高位存正负号,次高8bits存储n值,低23位存小数decimal. 低23位权值分别为:0.5、0.25、0.125...2^e, 其中e= -1,-2,-3...-23. 而2^(-23)决定了小数部分decimal的精度有限.

*****反过来,从内存读取float,硬件也做对应的一个系列操作. 读取最高位表示正负号,读取次高8位并计算出结果E然后继续作为2的指数算出一个整数Z(2^E),小数部分按位加权得到一个大于0小于1的数D,用小数D乘于Z. 最后输出结果.

参考资料:自己琢磨的。如有不明之处,可参考:http://zhidao.baidu.com/question/49681882.html

温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-03-28
两者位数不一样

一个是单精度

一个是双
相似回答