C++ c++;-双精度导致输出不确定,浮点不确定

C++ c++;-双精度导致输出不确定,浮点不确定,c++,floating-point,double,dynamic-arrays,dynamic-allocation,C++,Floating Point,Double,Dynamic Arrays,Dynamic Allocation,我尝试用程序中计算的数字填充动态分配的数组。 其中一个阵列非常大(1000 x 900 x 3) 如果我用double填充它,程序输出有时是合理的,但是在相同代码的连续运行中,会创建不同的输出。在大多数情况下,它们变得异常巨大(10e+74或10e+228)。 然而,如果我对那个特定的数组使用浮点数,一切都很好——数字是合理的并且是可复制的 你知道为什么会这样吗? 更重要的是:我可以只保留浮点数吗?还是有更大的问题需要进一步调查 编辑: 这将计算大数组的条目: T[it+1][ix][iy] =

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

如果我用double填充它,程序输出有时是合理的,但是在相同代码的连续运行中,会创建不同的输出。在大多数情况下,它们变得异常巨大(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)更改为奇数可以解决此问题。对这种现象有什么想法吗?

回答您的问题:如果浮点数的行为正确,您通常不应该看到双精度的错误行为(另一种情况是很可能的,因为浮点数更容易出现舍入错误和下溢/上溢)


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

听起来您的代码中有一个bug。如果没有看到操作数据的代码,建议一些有用的东西有点困难。我只是想知道当使用双精度浮点而不是双精度浮点时,这种行为是否常见,也就是说,使用双精度浮点是否是一种典型的指示。我建议将代码剥离到重现问题所需的最小值。在这个过程中,您可能会发现bug——删除一些本应无关的内容会使程序正常工作。如果没有,你会有你可以发布的东西。谢谢,这也是我最初的想法,但我现在已经仔细研究了它,没有发现任何错误,但我会再看一次…10e+228是十六进制6f7a6208b5068394。10e+74是4f81afd6ec0e1411。两者看起来都像是轻微损坏的ASCII数据,这与未初始化的数据理论是一致的。