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

来源:互联网 发布:低维数据映射到高维 编辑:程序博客网 时间:2024/05/17 21:44
不是说float和double都是7位精度么?那为什么可以精确到小数点后更多的位数?默认的精度是6位,那7位精度是什么意思啊?    有效数字是从左边第一位不为0的数开始算么?float型是7位有效数字,那是不是输入更多的数字时它都只能显示7位呢?
==========================================================================================================
*****对于精度是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. 最后输出结果.
0 0
原创粉丝点击