c ++ - 双精度导致非确定性输出,浮点数不导致

时间:2015-03-06 07:24:34

标签: c++ floating-point double dynamic-arrays dynamic-allocation

我尝试使用在程序中计算的数字填充动态分配的数组。 其中一个阵列非常大(1000 x 900 x 3)。

如果我用双打填充它,程序输出有时会合理,但是在相同代码的连续运行中会创建不同的输出。在大多数情况下,这些变得荒谬(10e + 74或10e + 228)。 但是,如果我为特定阵列使用浮点数,一切都很好 - 数字合理且可重复。

有没有想过为什么会这样? 更重要的是:我可以保留浮动数字,还是可能存在需要进一步调查的更大问题

修改

这计算了大数组的条目:

T[it+1][ix][iy] = T[it][ix][iy] + ((1/(dx*dx))*(T[it][ix+1][iy] - 2*T[it][ix][iy] + T[it][ix-1][iy]) + (1/(dy*dy))*(T[it][ix][iy+1] - 2*T[it][ix][iy] + T[it][ix][iy-1]) + M_SQRT2*cos(iy*dy)- Pe*((1/((2*dx)))*vx[it][ix][iy]*(T[it][ix+1][iy]-T[it][ix-1][iy]) + (1/(2*dy))*vy[it][ix][iy]*(T[it][ix][iy+1] - T[it][ix][iy-1])))*dt;

我不想发布整个代码,它很精彩。如果您想看到其他任何内容,请告诉我们。

编辑2:

用3D矢量重写程序后,没有改变任何东西。我最终发现,我使用偶数来表示数组大小。将它(以及间隔dx和dy)更改为奇数可以解决问题。对这种现象的任何想法?

1 个答案:

答案 0 :(得分:1)

回答你的问题:如果你对浮点数有正确的行为,你通常不应该看到不正确的双行为(反过来很可能,因为浮点数更容易出现舍入错误,而且下溢/溢出)。

通常,如果您看到10e+228等极端值,则表示您正在访问未初始化的内存:请检查所有变量和数组值是否已正确初始化。