【问题标题】:Java Code gives different results on androidJava Code 在 android 上给出不同的结果
【发布时间】:2013-01-11 10:47:09
【问题描述】:

我有一些代码,在 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

【问题讨论】:

  • 请将导致错误结果的代码部分粘贴到您的问题中...
  • 同意你的观点,@ppeterka,我们如何找到哪个类和代码给出了错误的结果?
  • 顺便问一下,你确定PC代码给出了正确的答案吗?海拔数据似乎有问题...除非您在Low Earth Orbit...您如何获取PC上的GPS数据?
  • @ppeterka 这不是 GPS 数据,而是国际空间站在轨道上的位置,基于来自 nasa 等的 TLE 信息。是的,在 pc 上运行的代码给出了其他来源检查的正确答案(@ 987654324@),海拔400公里左右。我粘贴了一个链接,因为有 14 个左右的类,testSGP4 是要运行的主要代码。
  • 哈哈,我以为我发现了明显的错误 :) 同时,请隔离提供输出的一小部分代码,并将其发布在此处 - 我们中的一些人可能不会能够从内容共享网站下载,这使我们无法帮助您...

标签: java android dalvik sgp4


【解决方案1】:

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 。特别注意浮点计算。 strictfp
  • 如果它们没有正确铸造/使用,它们可能会舍入产生错误的值。
  • @Budius,感谢您的回答,但我认为我并没有真正正确地表达这个问题。我的意思是为什么相同的代码甚至给出不同的答案。我不希望 PC 说 2+2=4 而 android 说 2+2=0.34
  • Afaik,FP-Calculations 可能会导致不同的结果,具体取决于系统,如果您愿意的话,这是一个可移植性问题。
【解决方案2】:

这个问题与我之前关于 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];

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多