打印

float的精度

[复制链接]
4079|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
st316|  楼主 | 2012-12-17 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
float a = 1, b, c, d;

        b = a/10;
        c = b/10;
        d = c/10;
上述代码,在执行到d=c/10时,会得到d=0.0009999999的错误结果,但float的精度不是有6~7位吗?

 float a = 1, b, c, d;

        b = a/10;
        c = b/10;
        d = a/1000;
上述代码,则可以得到正确结果d=0.001

double a = 1, b, c, d;

b = a/10;
c = b/10;
d = c/10;
上述代码,也能得到正确结果d=0.001。

怎么回事啊?
沙发
IJK| | 2012-12-17 15:33 | 只看该作者
得到d=0.0009999999的错误结果,但float的精度不是有6~7位吗?

(0.001 - 0.0009999999) / 0.001 = 0.0000001 : 这说明单精度float的精度约为7位

使用特权

评论回复
板凳
st316|  楼主 | 2012-12-17 19:13 | 只看该作者
IJK 发表于 2012-12-17 15:33
得到d=0.0009999999的错误结果,但float的精度不是有6~7位吗?

(0.001 - 0.0009999999) / 0.001 = 0.000 ...

“精度”好像不是这个意思啊

使用特权

评论回复
地板
figo20042005| | 2012-12-17 19:53 | 只看该作者
IJK说的对。单精度的只有6,7位

使用特权

评论回复
5
rider1| | 2012-12-17 20:23 | 只看该作者
float 并不能精确表达 0.1 , 0.01 , 0.001 ...等等这些数,因此就出现了转换误差.

使用特权

评论回复
6
kmani| | 2012-12-17 20:34 | 只看该作者
6_7位有效数字,你第一个表示是没有问题的。

使用特权

评论回复
7
byeyear| | 2012-12-17 20:58 | 只看该作者
浮点只能准确表示2^-1, 2^-2,2^-3 这些数字,即0.5, 0.25, 0.125等,以及它们的和。不能用2^-n表示的数字是无法用float准确表示的,即使换成double都白搭

使用特权

评论回复
8
ewigsaber| | 2013-1-11 20:34 | 只看该作者

RE: float的精度

float的确是6位精度,但是6位说的是小数点后的精度。我用的是Microsoft Visual Studio9.0,在头文件float.h里可以看到c实现的细节。路径是:Microsoft Visual Studio 9.0\VC\include\float.h。我的里面这么写的:
#define FLT_DIG         6                       /* 小数点后精确位数 */
#define FLT_MANT_DIG    24                      /* 尾数用24位二进制位存储 */
#define FLT_MAX         3.402823466e+38F        /* 最大float值 */
0.0009999999在计算机里是这样存储的:9.999999e-4,这不违背所谓的6位精度=。=!
另外5楼是对的,float不能精确表达0.1,0.01这样的数,是由于产生了转换误差,不过可以用格式转换修饰符弥补:假如float a=0.99;printf("%.1f\n",a);打印结果是1.0,而不是0.9。
感觉具体实现时候和系统有关的吧。你在什么平台/环境下得到的这个结果?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
李晓倩 + 1 www.jinjidejuren.tv/mingzhentankenan/
9
jack1991| | 2013-1-12 10:31 | 只看该作者
我在这里只以 float 型为例,从存储结构和算法上来讲, double 和 float 是一样的,不一样的地方仅仅是 float 是 32 位的, double 是 64 位的,所以 double能存储更高的精度。还要说的一点是**和程序一样,兼容性是有一定范围的,所以你想要完全读懂本文,你最好对二进制、十进制、十六进制的转换有比较深入的了解,了解数据在内存中的存储结构,并且会使用 VC.net 编译简单的控制台程序

链接:http://www.365ele.com/articles/2 ... %e5%88%86%e6%9e%90/

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝