注册 登录
编程论坛 C++教室

c++ 相同的数相减居然不为零(急死我了)

xfeng 发布于 2007-11-25 20:48, 1784 次点击
void main()
{
double a,b;
a=(0.5-0.1)/(-0.2+0.6);
b=-a/(0.2+0.6);
cout<<b+1.25;
}
程序本来很大   我把范围缩小并且简化过了
上面这个程序很easy   能口算出来   a=1  b=-1.25       cout出来的应该是0
不过大家可以把这个程序放到VC里编译一下   我的结果出来是-2.22045e-016

如果把-0.2+0.6 改为0.4   或者把0.2+0.6改成0.8   最后结果都是0
我原本的程序括号里的数都是变量

已经崩溃很久了,求教高手
12 回复
#2
雨中飞燕2007-11-25 20:55
这是计算机,不是理想的,数的位数是有限的
#3
xfeng2007-11-25 21:03
不是位数的问题
我把精度设到最小也一样
cout.precision(2);              //两位小数

另外我改成         b=-1/(0.2+0.6);           //把a直接换成1  输出就是0了
#4
Freeness2007-11-25 22:11
晕 超搞 你把double改成float就行了 答案就是0了!
#5
xfeng2007-11-25 22:15
这个我试过了
确实把float就是0     不过为什么double 会出这种问题
#6
Freeness2007-11-25 22:18
。。。。。。你去看一下关于小数的二进制问题就会明白了!
#7
VxWorks2007-11-25 22:44
#include <iostream>
using namespace std;
int main(void)
{
    double a,b;
    a=(0.5-0.1)/(-0.2+0.6);
    //    a=(0.5-0.1)/0.4;
    b=-1/(0.2+0.6);

    if(a==1.0)
        cout<<"a等于1"<<endl;

    if(b==-1.25)
        cout<<"b等于1.25"<<endl;

    getchar();
    return 0;
}
运行下看结果,然后把注释掉的那句加进来再看看。
-0.2+0.6这个计算时有精度损失,结果不为0.4,而是接近0.4的数。
#8
xfeng2007-11-25 22:55
void main()
{
                     double a=0.3/(0.6-0.3);
    double b=0.4/(0.6-0.2);
    cout<<a-1<<endl;
    cout<<b-1<<endl;
}
这个输出的结果为  
0
2.22045e-016
那为什么0.6-0.3没有损失呢?
#9
aipb20072007-11-25 23:11
你要知道浮点数在计算机里是怎样表示的。

你可以去搜索下,我看过,但是看不懂!最好的办法就是尽量避免!
#10
孤魂居士2007-11-26 15:10
是要研究下,以后小数据 不搞清楚
小问题能决定很多事情哦
我还是去百度看下``
#11
xinyue_5012007-11-27 21:13
计算机计算时有精度误差,你得到的值和你想要得到的GOAL已经相差无几了
     INT型无此类误差
#12
zjl1382007-11-28 07:22
这方面我也晕晕的,呵呵!!!
#13
冰烨2007-11-28 12:29
我对数制转换和浮点什么的几乎是个傻...
1