我尝试使用在程序中计算的数字填充动态分配的数组。 其中一个阵列非常大(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)更改为奇数可以解决问题。对这种现象的任何想法?
答案 0 :(得分:1)
回答你的问题:如果你对浮点数有正确的行为,你通常不应该看到不正确的双行为(反过来很可能,因为浮点数更容易出现舍入错误,而且下溢/溢出)。
通常,如果您看到10e+228
等极端值,则表示您正在访问未初始化的内存:请检查所有变量和数组值是否已正确初始化。