我有一个问题。以下是我的代码。我很奇怪为什么,我的“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;
}
答案 0 :(得分:0)
err3非常接近零,13个零。 err1和err2有6个零。
浮点数可以存储大约7位精度的十进制数字。
如果你打印出更多的err1和err2的小数,你可能会发现它们不完全一样。因为err1和err2是浮点数,它们存储7位精度。它们在最后一位数字(0.5zeros + 7digits)中可能略有不同,减去它们会得到0.000..00x(13个零)的结果。
双精度最多可达16个十进制数字。进行计算时,每次操作都会失去一点精度,因为每个结果都会被截断为大约16个十进制数字。如果你最终得到13位数的精度,那就完全正常了。