Java代码在android上给出了不同的结果

时间:2013-01-11 10:47:09

标签: java android dalvik sgp4

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

我使用的代码最初来自JsatTrack项目,并将这些答案作为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

2 个答案:

答案 0 :(得分: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上执行相同操作并比较其他值。

答案 1 :(得分: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设置为几行,当它应该是6378.135时它的值为0.0,因此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];

现在一切正常。