float的精度是多少位,c语言中double精度有几位小数float有几位小数
来源:整理 编辑:亚灵电子网 2023-11-07 03:08:58
本文目录一览
1,c语言中double精度有几位小数float有几位小数
loat为单精度,占4字节(32位)的内存空间,它的数值有效范围是-10的38次方到10的38次方,只表示7位有效数字。而double为双精度,8字节,正负10的308次方之间,能精确到16位。这应该就是他们的的最基本的区别吧。。。
2,float的精度详细一点告诉我谢谢
你所说的精度应该是指精确到小数点后面多少位,而float正是精确到小数点后6位的,用%f输出小数时就是输出6位。
使用float或者double存储有很多位的数时,由于浮点数的特殊存储形式,最低的那几位总是会有偏差的,这是正常现象。
3,float 精度
首先加上头文件#include <iomanip>然后在输出时(假设定义了float a,b)加上cout<<setprecision(2)<<a/b;其中setprecision(2)为保留两位小数,不足两位时,有几为显示几位
4,C中float的精度为什么是67位
不考虑指数位的话,float型的精度是0.00000...01(2进制),1前面有22个0,这个数也就是2的-23次方,换成十进制数是0.0000001192..,大致相当于十进制的7位精度这是二进制和十进制的区别,不考虑指数位的话,float型的精度是0.00000...01(2进制),1前面有22个0,这个数也就是2的-23次方,换成十进制数是0.0000001192..,大致相当于十进制的7位精度
5,c语言中的float数据类型的有效数字为什么是67位
float数据 机器内2113是2进制数,1位符号位8位指数位23位“尾数”位共32 位 2进制数。平时讲 有效数字 是6~7位 ,指10进制。通常程序输入的数是10进制,进入5261机器后要化4102成2进制,计算完又转十进制输出。10进制到2进制,2进制到10进制 转换1653,有的数化专不净,有的数化得净。如同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.50000000double、float都是浮点型。double(双精度型)比float(单精度型)存的数据更准确些,占的空间也更大。double精度是float的两倍,所以需要更精确的计算常使用double。单精度浮点数在机内占4个字节,用32位二进制描述。双精度浮点数在机内占8个字节,用64位二进制描述。浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。数符占1位二进制,表示数的正负。指数符占1位二进制,表示指数的正负。尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点指数存指数的有效数字。指数占多少位,尾数占多少位,由计算机系统决定。可能是数符加尾数占24位,指数符加指数占8位 -- float.数符加尾数占48位,指数符加指数占16位 -- double.知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,c语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
6,C语言中float的精确度是多少比如我输入12105 输出却是12104996
浮点数的表示同样是二进制的,所以10进制下的有限小数用二进制表示时常常变成无限循环小数,从而产生误差。这与精度是多少没有什么关系的,即使用更高精度的double,long double一样也可能出现这样的结果。float的精度在不同的编译环境下也可能是不同的,一般是7位有效。楼上的测试明显有问题,VS2010下测过,正是楼主所强调的问题:【误差造成四舍五入变了样!!】以下是测试程序: float a = 12.105f; printf("%4.2f\n",a); system("pause"); return 0;}怎么办?有办法,你看excel对这个问题的解决就很完美。但是怎么实现?比较麻烦,建议你直接上网搜搜。如果嫌麻烦,请换一个方式解决你需要解决的问题吧。这个问题比较有意思,手痒写了个程序出来:float Power10(unsigned int i) //递归计算10的i次幂 if(i) float tRes = Power10(i>>1); return tRes * ( (i & 0x1)? tRes * 10.0f : tRes ); //i转化二进制逻辑尺使用 } else return 1.0f; //递归终结,10的0次幂为1 }}float ResX(float a, int x) float tPower10 = Power10(x); if(a < 0) tPower10 = -tPower10; //如果是负数,添个负号 } a = (a * tPower10) + 0.5f; //负数会先被正过来 return (int)a / tPower10; //最后再负回去}ResX(12.105f, 2)的结果就是12.11了,再printf就没问题了。解决问题的核心就是我一开始说的二进制表示时的无限循环问题。当尾数是0.5时就不存在这个问题,因为0.5正好可以被二进制小数无误差表示出来。所以我先把12.1049999……乘上100,成为1210.5,正因为这个特性,此时误差消失。然后再加上0.5取整,就得到1211,再除以100就得了结果。但是写成return (int)((a * tPower10) + 0.5f) / tPower10;却不行,不是太清楚原因了。这个方法也不太清楚有多可靠,至少我觉得在有些环境下应该会失效。先试试看吧。float的有效长度为七位,七位以后的数都是随机的,并不遵循四舍五入。
文章TAG:
float的精度是多少位float 精度 多少