c语言有效数字
⑴ c语言 有效位数怎么数
有效位是整体的长度算上小数点后面。
有效数字是指的是小数点后面的数字
所以float单精度浮点型的有效数字是7位(算上小数位)
double
双精度浮点型16位也是算上小数位。
⑵ C语言中的有效数字怎么定义的例如123.456的有效数字是从1开始还是从4开始小数点也算有效数
C语言中的有效位数不是平时我们说的小数点后面的有效数字,而是指所有的数字,比如:123.456是从1开始的。如果数据类型是float型,那么有效位数是7位,也就是说存储float b=123.4567891;只能保证前7位是正确的,即我们取出b时它的前7位完全没问题就是123.4567,但是后面的就不知道是什么了。如果是double型数据,则有效位数是15位,存储时类似于float型。
⑶ C语言怎么保留六位有效数字
IEEE浮点表示
IEEE浮点标准用
.png
的形式近似表示一个数。并且将浮点数的位表示划分为三个字段:
符号(sign)s决定这个数是负数(s=1)还是正数(s=0)。可以用一个单独的符号s直接编码符号s。
尾数(signficand)M是一个二进制小数,它的范围是1~2-ξ或者是0~1-ξ。
n位小数字段.png编码尾数M。
阶码(exponent)E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。k位的阶码字段 .png编码阶码E。
在单精度浮点格式(c语言的float)中,s,exp和frac字段分别为1位,8位和23位,而双精度浮点格式(c语言中的double)中,s,exp和frac字段分别为1位,11位和52位。
一个浮点数的常见比特位表示如下:
单精度
双精度
而根据exp的值,被编码的值可以分为三大类不同的情况。下面进行一一解释。
情况1:规格化的值
即最普遍的情况,当exp,即阶码域既不为全0,也不为全1的情况。在这种情况下,阶码字段解释为以偏置(biased)形式表示有符号整数,即E=exp-Bias,exp是无符号数(1~254)。Bias是一个等于.png的偏置值,对于单精度来说,k=23,Bias=127,因此E的范围是-126~+127。
frac被描述为小数值,且0≤frac<1,其二进制表示为0.frac。尾数定义为 M=1+frac ,则M=1.frac。那么就有1≤M<2,由于总是能够调整阶码E,使得M在范围1≤M<2,所以不需要显示的表示它,这样还能获得一个额外的精度位。也就是说,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的frac部分,等到读取的时候,再把第一位的1加上去。
情况2:非规格化的值
当exp,即阶码域为全0时,所表示的数便为非规格化的值,该情况下的阶码值E=1-Bias(注:为从非格式化值转换到格式化值提供了一种方法)。尾数M=frac
非规格化的数有两个作用。
表示数值0。格式化数中,我们总使得M≥1,因此就无法表示0。而阶码全0时,且尾数也全0时,就可以表示0了。
表示接近0.0的数。它所表示的值分布地接近于0.0,该属性成为逐渐溢出。
情况3:特殊值
有两种
阶码全为1,小数域全为0。它得到值为 +∞(s=0)或-∞(s=1),它在计算机中可以表示溢出的结果,例如两个非常大的数相乘。
阶码全为1,小数域不全为0。它得到值为NaN(Note a Number)。它在计算机中可以表示非法的数,例如计算根号-1时的值。
有了前面了基础,我们就可以来计算浮点数的数值范围了。以单精度(float)为例,我们知道它的指数范围(即E)为-126~+127,而M的范围为1≤M<2,实际上,对于单精度,1≤M≤2-2^(-23)(注:23为frac字段所占的比特位)。那么我们就可以得到单精度的最大值为:
.png
同理,我们可以得到单精度的最小值为:
.png
我们仅仅以单精度为例,用同样的方法可以计算其他精度的浮点数数值范围,在此不再赘述。
浮点数的有效位
有效位也可以理解为我们常说的精度。浮点数的精度是由尾数的位数来决定的。
对于单精度(float),它的尾数为23位,而2^23=8388608,共7位,也就是说最多能有7位有效数字,但至少能保证6位,因此其有效位为6~7位。当然我们可以通过下面的内容进一步理解。以下计算结果保留10位小数。
...png
观察a和b的结果可以发现,0.0000001和0.0000002之间的其他数是没有办法通过单精度浮点数来精确表示的,也就是说,只有到小数点后面7位的值才是精确的,同理,观察b和c的结果,0.0000002到0.0000004之间的其他数也是不能通过单精度浮点数精确表示的,更不幸地是,这之间的数,甚至只能精确到第6位。
这也就有了单精度浮点数的有效位为6~7位的结论。根据相似的方法,我们同样可以得到双精度浮点数的有效位为15~16位的结论,这里不再赘述。
浮点数在内存中的存储
了解了这么多,我们来看一下一个小数究竟是如何在内存中存储的。以float f = 8.5f为例。其二进制表示为.png,可见指数实际值为3,则根据E=exp-Bias,可知exp=E+Bias=3+127=130,根据M=1+frac,可知,frac=M-1=0.0001(二进制)而.png
⑷ C语言中如何输入确定的有效数字
printf不能控制输出有数字。想控制得自己写程序,如下:
char
ss[20];
sprintf(ss,
"%lf",
s);
char
*p
=
strchr(ss,
'.');
if
(p!=NULL)
{
if
(p-ss
<
11)
ss[11]=0;
}
这时候ss中就是一个合法的数字了。简单写的,没考虑超过10位的整数,也没考虑输出结果有没有10位。只是超过了10位就截尾。
⑸ c语言中的单精度数据的有效位数是什么意思
c语言中的单精度数据的有效位数是7位。
c语言中的单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度。尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。
(5)c语言有效数字扩展阅读:
单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算。在计算机存储器中占用4个位元(32 bits)存储空间,包括符号位1位,阶码8位,尾数23位。利用“浮点”(浮动小数点)的方法,可以表示一个范围很大的数值。其数值范围为-3.4E38~3.4E38。
单精度浮点数最多有7位十进制有效数字,如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。单精度浮点数的指数用“E”或“e”表示。
⑹ C语言里float有效数字究竟是6位还是7位
float数据
机器内是2进制数,
1位符号位
8位指数位
23位“尾数”位
共32
位
2进制数。
平时讲
有效数字
是6~7位
,指10进制。
通常程序输入的数是10进制,进入机器后要化成2进制,计算完又转十进制输出。
10进制到2进制,2进制到10进制
转换,有的数化不净,有的数化得净。
如同10进制分数化10进制小数,有的化得净(例如
4分之1,变0.25),有的化不净(例如
3分之1,变0.33333....)。
10进制到2进制,2进制到10进制
转换,化得净的效数字7位,化不净的效数字6位,因为最后一位有舍入误差。
例如:
float
x,y;
x=0.51;
//
化不净
y=0.5;
//
化得净
printf("x=%.8f
y=%.8",x,y);
//
输出
0.50999999
0.50000000
⑺ c语言中怎么保留一位有效数字
1、在C语言中一个数保留1位小数可以通过精度限定符来完成,精度限定符由一个点号后跟一个整数组成。如果要限定小数点后面一位的类型为0或者5,可以使用先乘取整再除的方法进行操作。
2、例程:
#include<stdio.h>
intmain(){
dobulea=1.23456;
printf("%.1f",((int)a*2)/2.0);//使用精度限定符%.1f,输出:1.0
return0;
}
⑻ 在c语言中,有效数字和有效数位怎么解释
有效数字位数是小数点以后的数字位数,而电脑输出的数字位数决定于定义变量的模式,并一般采用“四舍五入”的方法。
如
int i;
printf("Enter a value for i...\n");
scanf("%d", &i);
键盘输入0.333,储存到变量i里的数是0(约掉了)
如果改成:
double i;
那就会储存0.333000
在输出数值的时候可以先设定有效数值位数:
double i;
printf("Enter a value for i...\n");
scanf("%d", &i);
printf("\ni = %.4lf", i);
在输出的时候在电脑上会输出“i = 0.3330”
.在处理过程中不会当做有效数字位数来处理。
有效数字位数还可以通过常量来设定,在此不再赘述。
希望对你有用!
⑼ c语言 保留15位有效数字
用 double 型变量,可保留14-15位有效数字精度。float 只有7位精度。
double a=123.4567890123456;
printf("%.14e",a); // 保证输出 15 位有效数字
⑽ C语言数据类型有效数字问题
1、long
int
的有效位是32位,double的有效位是15~16位。长整型与double型运算时要一律转换成double的原因是:double所存的数的范围,比long
int
要大得多。而且,因为计算机存储方式的原因,整型和浮点型是不能直接运算的。两个小一点的数运算,不论怎么转换,对结果都没有影响,但是如果是一个比较小的数,和一个很大的数运算,当然是省略小的比较精确。
2虽然两个数都能用float
存储,但是他们的结果的有效数字是大于float的存储范围,在运算时只允许结果小于7位的有效数参加运算,也就是说,不是每位数都能参加运算。如果换成double每位数都能参加运算,虽然最后的有效位是一样的,但是精度却提高了。尤其当结果还是一个比较大的数时。