【问题标题】:Floor function returning EXC_BAD_ACCESS楼层函数返回 EXC_BAD_ACCESS
【发布时间】:2010-05-27 18:39:22
【问题描述】:

我使用的 cod 包含这些 sn-ps 代码。我用参数 2455343.50000 调用 ThetaG_JD,这只是一个儒略日期示例。每次我运行程序时,我都会在指定的行上收到一个 EXC_BAD_ACCESS。当使用 gdb 并打印出中间值并通过 floor 函数传递它们时,我没有收到任何错误,但是当使用 Frac() 时它总是返回错误。

double Frac(double arg)
{
    /* Returns fractional part of double argument */
    return arg - floor(arg);
}

double ThetaG_JD(double jd)
{
    /* Reference:  The 1992 Astronomical Almanac, page B6. */

    double UT=0, TU=0, GMST=0;
    //THIS LINE
    UT=Frac(jd+0.5);
    // THAT ONE ^^
    jd=jd-UT;
    TU=(jd-2451545.0)/36525;
    GMST=24110.54841+TU*(8640184.812866+TU*(0.093104-TU*6.2E-6));
    GMST=Modulus(GMST+secday*omega_E*UT,secday);

    return (twopi*GMST/secday);
}

【问题讨论】:

  • 你能检查一下 Frac 是否被定义为其他地方的类型吗?尝试更改函数 Frac 的名称,看看是否有所不同?
  • 重命名函数 dumbledoore 仍然会像使用 modf 一样产生错误。

标签: c++ floor


【解决方案1】:

EXC_BAD_ACCESS 让我有些费解,但这听起来有点像浮点异常。已经有一段时间了,但我记得在 x87 硬件上,您可以生成溢出/下溢/NaN,并且处理器不会让您知道异常,直到 next FP 操作可能在代码的完全不同的部分。你可以试试jd += 0.5 之类的东西,而不是调用 Frac,看看它是否仍然死机。

此外,x87 状态寄存器将能够向您显示是否存在错误状态,您应该能够在 gbd 中看到它。

【讨论】:

  • 在检查状态寄存器时,我确实注意到存在错误状态。我通过简单地将 floor 函数转换为 int 来解决这个问题。它似乎按预期工作。
  • 至少首先考虑调查错误状态是如何设置的 - 您可能会在其他地方产生意外的错误结果,而这些结果恰好看起来“足够好”。
  • 是的,我将对此进行进一步调查,因为当程序终止时,我仍然返回错误。
  • fstat 寄存器似乎包含 32。但是我不确定这个值是什么意思。
  • '位五控制是否可以发生精度异常。每当 FPU 产生不精确的结果(通常是内部舍入操作的结果)时,就会发生精度异常。尽管许多操作会产生精确的结果,但更多的操作不会。例如,将一除以十将产生不精确的结果。因此,这个位通常是一个,因为不精确的结果很常见。来自arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_14/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
相关资源
最近更新 更多