C++ 楼层功能返回EXC\u坏访问
我使用的cod包含这些代码片段。我打电话给Tag_JD的参数是2455343.50000,这只是一个样本儒略日期。每次运行该程序时,我都会在指示行上收到EXC_BAD_访问权限。当使用gdb并打印出中间值并通过floor函数传递它们时,我没有得到错误,但当使用Frac()时,它总是返回错误C++ 楼层功能返回EXC\u坏访问,c++,floor,C++,Floor,我使用的cod包含这些代码片段。我打电话给Tag_JD的参数是2455343.50000,这只是一个样本儒略日期。每次运行该程序时,我都会在指示行上收到EXC_BAD_访问权限。当使用gdb并打印出中间值并通过floor函数传递它们时,我没有得到错误,但当使用Frac()时,它总是返回错误 double Frac(double arg) { /* Returns fractional part of double argument */ return arg - floor(ar
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);
}
EXC_BAD_访问对我来说有些困惑,但这听起来像是一个可疑的浮点异常。已经有一段时间了,但正如我在x87硬件上回忆的那样,您可能会生成溢出/下溢/NaN,处理器在下一个FP操作之前不会让您知道异常情况,而下一个FP操作可能位于代码的完全不同部分。您可以尝试类似于
jd+=0.5
的方法,而不是调用Frac,看看它是否仍然死亡
此外,x87状态寄存器将能够向您显示是否存在错误状态,并且您应该能够在gbd中看到错误状态。您可以检查Frac是否定义为其他类型吗?尝试更改函数Frac的名称,看看这是否有区别?重命名函数dumbledoore仍然会产生错误,就像使用modf一样。在检查状态寄存器时,我注意到存在错误状态。我解决了这个问题,只是简单地把一个角色转换成一个int。它看起来像预期的工作。至少考虑一下错误状态是如何设置的。你可能在其他地方出现意想不到的不正确的结果。我将进一步研究这个问题,因为当程序终止时,我仍然返回一个错误。但是,我不确定该值的含义。第五位控制是否会发生精度异常。每当FPU产生不精确的结果(通常是内部舍入操作的结果)时,就会发生精度异常。尽管许多操作会产生准确的结果,但更多操作不会。例如,将1除以10将产生不精确的结果。因此,该位通常是一位,因为不精确的结果非常常见