【问题标题】:c++ - double precision leads to non-deterministic output, float does notc++ - 双精度导致不确定的输出,浮点数不会
【发布时间】:2015-05-07 18:36:43
【问题描述】:

我尝试用程序中计算的数字填充动态分配的数组。 其中一个阵列非常大(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)更改为奇数可以解决此问题。对这种现象有什么想法吗?

【问题讨论】:

  • 听起来你的代码有错误。
  • 没有看到操纵数据的代码,很难提出一些有用的建议。
  • 我只是想知道在使用双精度而不是浮点数时这种行为是否常见,即是否是使用浮点数而不是双精度数的典型指示。
  • 我建议将代码精简到重现问题所需的最低限度。您可能会在该过程中发现错误 - 删除应该不相关的内容会使程序正常工作。如果没有,您将有一些可以发布的内容。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这也是我最初的想法,但我现在看得很仔细,没有发现任何问题,但我会再看一遍......
  • 10e+228 是十六进制 6f7a6208b5068394。 10e+74 是 4f81afd6ec0e1411。两者看起来都像是轻微损坏的 ASCII 数据,与未初始化数据理论一致。
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2018-02-23
  • 2018-07-06
  • 2011-04-18
相关资源
最近更新 更多