Функция пола, возвращающая EXC_BAD_ACCESS - PullRequest
0 голосов
/ 27 мая 2010

Код, который я использую, содержит эти фрагменты кода. Я звоню в ThetaG_JD с аргументом 2455343.50000, который является просто примером юлианской даты. Каждый раз, когда я запускаю программу, я получаю 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);
}

1 Ответ

1 голос
/ 28 мая 2010

EXC_BAD_ACCESS несколько озадачивает меня, но это звучит подозрительно, как исключение с плавающей запятой. Это было какое-то время, но, насколько я помню, на оборудовании x87 вы могли генерировать переполнение / недополнение / NaN, и процессор не сообщал бы вам об этом, за исключением операции next FP, которая могла бы быть полностью другая часть кода. Вы можете попробовать что-то вроде jd += 0.5 вместо вызова Фрака и посмотреть, умрет ли он до сих пор.

Кроме того, регистр состояния x87 сможет показать вам, есть ли состояние ошибки, и вы должны увидеть его в gbd.

...