不是说float和double都是7位精度么?那为什么可以精确到小数点后更多的位数?默认的精度是6位,那7位精度是什么意思啊?
有效数字是从左边第一位不为0的数开始算么?float型是7位有效数字,那是不是输入更多的数字时它都只能显示7位呢?
关于浮点型的有效数字和精度的问题
答案:3 悬赏:10
解决时间 2021-02-02 02:41
- 提问者网友:傲气稳全场
- 2021-02-01 13:49
最佳答案
- 二级知识专家网友:如果这是命
- 2021-02-01 15:06
*****你提的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 ;
*****对于“那是不是输入更多的数字时它都只能显示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. 最后输出结果.
*****对于精度是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 ;
*****对于“那是不是输入更多的数字时它都只能显示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. 最后输出结果.
全部回答
- 1楼网友:风格单纯
- 2021-02-01 16:55
两者位数不一样
一个是单精度
一个是双
- 2楼网友:无字情书
- 2021-02-01 15:44
可以这样定义
a=dlbarr(2)
a[0] = 40411323.654d
a[1] = 42583654.878d
或者直接 a = [40411323.654d,42583654.878d]
如果不写d,小数默认是float类型,就会损失精度
对于你这样的情况,idl先解析40411323.654成float类型,就是40411324.000,再强制转换到double,前一步已经损失精度了
可以使用print,a,format='(f0.3)'查看小数点后三位有效数字
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯