C语言数据精度

如果现在计算机算出一个浮点型数据,这个结果在计算机内部是一个完整又精确的结果么?(不受数据精度,字节限制)
而让计算机输出这个数据时,我们知道float数据是有精度的,那从微观上讲,它是如何从计算机中吐出这个数据的?
输出格式符的时候,比方我可以控制让它输出很多列,很多位小数,远远超过float的精度范围,那有什么后果?
跪求各路高手,微观一点,详细一点最好。

计算机内部用2进制,我们输入10进制,
所以 输入时 10进制 要转换为 2进制,
输出时,2进制 要转换为 10进制。
浮点型数据 10进制 要转换为 2进制,常常是 “化不净” 的。
如同 算术里的 1.0/3.0 = 0.333333333333333333333333333....

浮点型数据 float 用 32 位 2 进制, double 用 64 位 2 进制, 由于位数的限制。 float 有效数字 精度 只有 6-7 位 10进制,double 精度 14 位。

控制让它输出很多位小数,远远超过float的精度范围,计算机能输出,但超出 6-7 位 的数值不可靠。例如:
float x=0.3;
printf("%30.20f",x);
计算机输出: 0.30000001192092896000
显然 后面的小数 1192092896000 没实际意义。追问

后面的小数 1192092896000 这个是计算机随机产生的么?它为什么不报错呢?

追答

不是随机产生,是按小数20的格式要求(%30.20f),由转换运算产生的。没有错误,当然不报错。

它只不过是由于 2-10,10-2 转换, 含截断误差而已。

追问

它只不过是由于 2-10,10-2 转换, 含截断误差而已。

这句话什么意思。。刚入门,菜鸟求详解。。

追答

float x=0.3;
2-10, 输入时 10进制 要转换为 2进制, 含截断误差
10-2 , 2进制 要转换为 10进制, 含截断误差
float x=0.3;
printf("%30.20f\n",x); printf("%30.19f\n",x); printf("%30.18f\n",x);
printf("%30.17f\n",x); printf("%30.16f\n",x);
输出:
0.30000001192092896000
0.3000000119209289600
0.300000011920928960
0.30000001192092896
0.3000000119209290

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-26
什么精度问题啊,在2进制的世界里,讨论这个是不现实的

计算机是二级制存储的,这个你应该知道
当十进制转换为二进制的时候,小数不是的存储时近似的(除了一小部分的小数)
这一小部分的数是2的n次方分之几,如0.5.0.25.0.375等,也就是1/2,1/4,3/8等数据
除了这些外,其他的都是近似存储的
不信,你可以手工计算一下十进制的0.1,化成二进制后,这是一个无限小数

所以啊,讨论精度问题就不现实了
因为存储的就是一个近似的数值,那么打印出来后,不可能是精确的

有一个办法可以做到,不过存储量要很大,就是用字符串来存储小数,这个道理你应该能明白,呵呵追问

对,是有的小数不可能准确化为二进制的。
C语言中可以控制让它输出很多列,很多位小数,远远超过float的精度范围,那有什么后果?
比方说float a=0.375
printf("%40.20f",a)
我试过编译不会出错,那么显示出来的那么多小数位数显然不可能在f数据中储存下,那么它们是哪里来的?

追答

我编译了一下,后面全部是0

本回答被网友采纳
第2个回答  2018-01-24
c语言中:

float浮点数7位有效数字。
double双精度数16位有效数字。

单精度数的尾数用23位存储,加上默认的小数
点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 <
10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16
< 9007199254740992 < 10^17,所以双精度的有效位数是16位

单精度浮点数的实际有效精度为24
位二进制,这相当于 24*log102≈7.2
位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为
2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)

浮点数7位有效数字。(应该是单精度数)
双精度数16位有效数字。
浮点数取值范围:
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。
双精度数取值范围:
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。

所以精度是测量值与真值的接近程度。包含精密度和准确度两个方面精度的等级是以它的允许误差占表盘刻度值的百分数来划分的,其精度等级数越大允许误差占表盘刻度极限值越大。量程越大,同样精度等级的,它测得压力值的绝对值允许误差越大。
精度
经常使用的的精度为 2.5 、1.5 级,如果是1.0和0.5级的属于高精度,现在有的数字已经达到0.25级。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网