为什么浮点数不能给出0值?

时间:2013-11-27 09:13:13

标签: visual-c++

我有一个问题。以下是我的代码。我很奇怪为什么,我的“err3”输出不能给出0的值?是因为数据类型是浮点数?

输出如下:

err1的值是-7.03125e-06 err2的值是7.03125e-06 err3的值是-4.54747e-13

err1和err2之间的操作是+,因此,err3的值应为0.

任何人都可以帮我解释和解决这个问题吗?我有谷歌,但仍然没有得到结果。

提前致谢:)

void calnormal()
{
long numcal;
float indexNC0,indexNC1;
float error;

float aa0 = 0, ab0 = 0, ac0 = 0, ad0 = 0;
float          bb0 = 0, bc0 = 0, bd0 = 0;
float                   cc0 = 0, cd0 = 0;
float                            dd0 = 0;

float aa, ab, ac, ad;
float     bb, bc, bd;
float         cc, cd;
float             dd;

for(int i=0;i<noofvert;i++)
{
    numcal = vlist[i].returnsizef();
    for(int j=0;j<numcal;j=j+2)
    {
        indexNC0 = vlist[i].returnindexf(j);
        u.ax = vlist[i].returnx() - vlist[indexNC0].returnx();
        u.ay = vlist[i].returny() - vlist[indexNC0].returny();
        u.az = vlist[i].returnz() - vlist[indexNC0].returnz();
        if(j == 0){v0 = u;}

        indexNC1 = vlist[i].returnindexf(j+1);
        v.ax = vlist[i].returnx() - vlist[indexNC1].returnx();
        v.ay = vlist[i].returny() - vlist[indexNC1].returny();
        v.az = vlist[i].returnz() - vlist[indexNC1].returnz();

        normal.ax = u.ay * v.az - u.az * v.ay;
        normal.ay = u.az * v.ax - u.ax * v.az;
        normal.az = u.ax * v.ay - u.ay * v.ax;

        normal.D = - vlist[i].returnx() * normal.ax -    vlist[i].returny() * normal.ay - vlist[i].returnz() * normal.az;

        aa = normal.ax * normal.ax;
        ab = normal.ax * normal.ay;
        ac = normal.ax * normal.az;
        ad = normal.ax * normal.D;

        bb = normal.ay * normal.ay;
        bc = normal.ay * normal.az;
        bd = normal.ay * normal.D;

        cc = normal.az * normal.az;
        cd = normal.az * normal.D;

        dd = normal.D * normal.D;

        aa0 = aa0 + aa;
        ab0 = ab0 + ab;    bb0 = bb0 + bb;
        ac0 = ac0 + ac;    bc0 = bc0 + bc;    cc0 = cc0 + cc;
        ad0 = ad0 + ad;    bd0 = bd0 + bd;    cd0 = cd0 + cd;    dd0 = dd0 + dd;


    }

    double err1,err2,err3;

    **err1 = cd0 * vlist[i].returnz();
    err2 = dd0 ;

    err3 = err2 + err1;
    cout  <<  err1 << " " << err2 << " " << err3 << endl;**


    cout << endl;
}
cout << endl;

}

1 个答案:

答案 0 :(得分:0)

err3非常接近零,13个零。 err1和err2有6个零。

浮点数可以存储大约7位精度的十进制数字。

如果你打印出更多的err1和err2的小数,你可能会发现它们不完全一样。因为err1和err2是浮点数,它们存储7位精度。它们在最后一位数字(0.5zeros + 7digits)中可能略有不同,减去它们会得到0.000..00x(13个零)的结果。

双精度最多可达16个十进制数字。进行计算时,每次操作都会失去一点精度,因为每个结果都会被截断为大约16个十进制数字。如果你最终得到13位数的精度,那就完全正常了。