Java-код дает разные результаты на Android

У меня есть некоторый код, работающий на ПК как просто Java-код, он дает нужный мне ответ (правильный). На андроиде один и тот же код дает очень разные ответы.

Код, который я использую, изначально был из проекта JsatTrack, и дает эти ответы в виде java-проекта в eclipse (правильные ответы):

Lat [deg]:10.386382587628313
Lon [deg]:-93.88496253189982
Alt [m]  :418288.8335920386

Тот же код с тем же вводом на Android дает такой результат:

Lat [deg]:-37.97635062163793
Lon [deg]:-147.34940989563563
Alt [m]  :6.86973250782099E29

Я новичок в Java, так где бы я начал искать, чтобы отследить такую ​​проблему. Будет ли, например, Android справиться с математикой?

Итак, я думаю, что мой вопрос сводится к тому, почему ПК и Android дают разные ответы на одни и те же математические вопросы? 2+2 должен давать одинаковый ответ на любой платформе. Математика в моделях SGP4 более сложная, но это все еще просто математика.

Код доступен здесь, если кто-то хочет посмотреть

https://dl.dropbox.com/u/70291490/jstest.zip

2 ответа

Решение

Эта проблема была очень похожа на мой предыдущий вопрос о stackru (http://stackru.com/questions/14190692/how-to-debug-dalvikvm-rejecting-opcode)

Android не может обрабатывать много локальных переменных, поэтому решение их вне метода. В моем предыдущем вопросе dalvikvm отклонял метод. В этом случае все было иначе, этот код здесь:

ss = 78.0 / radiusearthkm + 1.0;

устанавливал ss как 1.0, так как в то время как radiuseathkm устанавливался несколькими строками ранее в отладчике, он имеет значение 0.0, когда он должен быть 6378.135, поэтому ss будет = 1.0122292801892716. Эта ошибка затем распространяется на следующие несколько сотен вычислений, и возникает проблема.

Итак, я изменил это:

public static boolean sgp4init(
        Gravconsttype whichconst, char opsmode, final int satn, final double epoch,
        final double xbstar, final double xecco, final double xargpo,
        final double xinclo, final double xmo, final double xno,
        final double xnodeo, SGP4SatData satrec)
{
    /* --------------------- local variables ------------------------ */
    double ao, ainv, con42, cosio, sinio, cosio2, eccsq,
            omeosq, posq, rp, rteosq,
            cnodm, snodm, cosim, sinim, cosomm, sinomm, cc1sq,
            cc2, cc3, coef, coef1, cosio4, day, dndt,
            em, emsq, eeta, etasq, gam, argpm, nodem,
            inclm, mm, nm, perige, pinvsq, psisq, qzms24,
            rtemsq, s1, s2, s3, s4, s5, s6,
            s7, sfour, ss1, ss2, ss3, ss4, ss5,
            ss6, ss7, sz1, sz2, sz3, sz11, sz12,
            sz13, sz21, sz22, sz23, sz31, sz32, sz33,
            tc, temp, temp1, temp2, temp3, tsi, xpidot,
            xhdot1, z1, z2, z3, z11, z12, z13,
            z21, z22, z23, z31, z32, z33,
            qzms2t, ss, j2, j3oj2, j4, x2o3, //r[3], v[3],
            tumin, mu, radiusearthkm, xke, j3;
    double[] r = new double[3];
    double[] v = new double[3];

к этому:

static double radiusearthkm, ao, ainv, con42, cosio, sinio, cosio2, eccsq,
        omeosq, posq, rp, rteosq,
        cnodm, snodm, cosim, sinim, cosomm, sinomm, cc1sq,
        cc2, cc3, coef, coef1, cosio4, day, dndt,
        em, emsq, eeta, etasq, gam, argpm, nodem,
        inclm, mm, nm, perige, pinvsq, psisq, qzms24,
        rtemsq, s1, s2, s3, s4, s5, s6,
        s7, sfour, ss1, ss2, ss3, ss4, ss5,
        ss6, ss7, sz1, sz2, sz3, sz11, sz12,
        sz13, sz21, sz22, sz23, sz31, sz32, sz33,
        tc, temp, temp1, temp2, temp3, tsi, xpidot,
        xhdot1, z1, z2, z3, z11, z12, z13,
        z21, z22, z23, z31, z32, z33,
        qzms2t, ss, j2, j3oj2, j4, x2o3, //r[3], v[3],
        tumin, mu,  xke, j3;


public static boolean sgp4init(
        SGP4unit_a.Gravconsttype whichconst, char opsmode, final int satn, final double epoch,
        final double xbstar, final double xecco, final double xargpo,
        final double xinclo, final double xmo, final double xno,
        final double xnodeo, SGP4SatData satrec)
{

    double[] r = new double[3];
    double[] v = new double[3];

и все теперь работает правильно.

I am new to java so where would I start looking to track down a problem like this?

Подключите ваш телефон Android через USB к ПК и в Eclipse дважды щелкните левой кнопкой мыши на соответствующем коде, который начинает выполнять математические операции, он должен отображаться синей точкой (точка останова кода). Нажмите кнопку с небольшой ошибкой (кнопка ОТЛАДКА) на панели инструментов Eclipse. Он запустит проект на устройстве и остановит обработку, где бы вы ни поставили точку.

Теперь вы можете использовать панель инструментов представления отладки, чтобы построчно просматривать код и навести курсор мыши на ваши классы / поля, чтобы увидеть их значения. Вы можете сделать то же самое на ПК и сравнить друг с другом значение.

Другие вопросы по тегам