1

我有一些代码,在 PC 上作为 java 代码运行,它给出了我想要的答案(正确的答案)。在 android 上,相同的代码给出了非常不同的答案。

我使用的代码最初来自 JsatTrack 项目,并将这些答案 jun 作为 eclipse 中的 java 项目提供(正确答案):

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 处理数学的方式吗?

所以我想我的问题归结为为什么 PC 和 android 会对相同的数学问题给出不同的答案?2+2 应该在任何平台上给出相同的答案。SGP4模型中的数学更复杂,但它仍然只是数学。

如果有人想看,代码可以在这里找到

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

4

2 回答 2

4

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

通过 PC 上的 USB 连接您的 Android 手机,然后在 Eclipse 上双击开始进行数学运算的相关代码的左侧,它应该出现一个蓝点(代码断点)。单击 Eclipse 工具栏上带有小错误的按钮(DEBUG 按钮)。它将在设备上启动项目并在您放置点的任何位置停止处理。

现在您可以使用调试视图工具栏逐行浏览代码并将鼠标悬停在您的类/字段上以查看它们的值。您可以在 PC 上执行相同的操作并比较彼此的值。

于 2013-01-11T11:01:01.303 回答
0

这个问题与我之前关于stackoverflow的问题非常相似(http://stackoverflow.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];

现在一切正常。

于 2013-01-11T19:43:17.777 回答