java - VC++ 与 Java 的结果不一致

标签 java android visual-c++ coordinates trigonometry

我有一个用 Visual C++ 编写的运行已久的例程,该例程在 PC 上运行,它根据给定的纬度/经度坐标计算地球表面两点之间的距离。

我已将其转换为 Java 作为 Android 端口的一部分,但我得到了不同的结果。为了调查其中的原因,我将一个复杂的三角方程拆分成多个位来跟踪每一步发生的情况。

然而,在Visual C++中逐步计算的结果与复杂语句得到的结果不同,尽管它们显然应该是相同的。我想知道为什么!

正如预期的那样,Java 版本在这两种情况下产生相同的结果。

这是 Visual C++ 代码:

double CCoord::GetDistanceRadians(double dLatRadians, double dLongRadians)
{
    double dResult;

    // This is the step by step code
    double r1, r2, r3, r4, r5;
    r1 = sin(m_dLatRadians);
    r2 = sin(dLatRadians);
    r3 = cos(dLatRadians);
    r4 = m_dLongRadians - dLongRadians;
    r5 = cos(r4);

    r1 *= r2;
    r2 = r3 * r3;
    r2 *= r5;
    r4 = r1 + r2;

    // This is the original statement: r4 and dResult should be equal
    // (but they aren't)
    dResult = sin(m_dLatRadians) * sin(dLatRadians) +
        cos(m_dLatRadians) * cos(dLatRadians) * cos(m_dLongRadians - dLongRadians);

    // Protect against maths processor inaccuracies
    if ((dResult > 1.0) || (dResult < -1.0))
        dResult = 0.0;
    else
        dResult = acos(dResult);

    return dResult;
}

Java 代码如下:

    // Return angular distance in radians
private double getDistanceRadians(double dLatRadians, double dLongRadians)
{
    double result;

    // Do JIT test
    checkRadianValues();

            // This is the step by step code
    double r1, r2, r3, r4, r5;
    r1 = Math.sin(m_dLatRadians);
    r2 = Math.sin(dLatRadians);
    r3 = Math.cos(dLatRadians);
    r4 = m_dLongRadians - dLongRadians;
    r5 = Math.cos(r4);

    r1 *= r2;
    r2 = r3 * r3;
    r2 *= r5;
    r4 = r1 + r2;

    // This is the original statement: r4 and result should be equal
    // (and they are)
    result = Math.sin(m_dLatRadians) * Math.sin(dLatRadians) +
                Math.cos(dLatRadians) * Math.cos(dLatRadians) *
                Math.cos(m_dLongRadians - dLongRadians);

    // Protect against maths processor inaccuracies
    if ((result > 1.0d) || (result < -1.0d))
        result = 0.0d;
    else
        result = Math.acos(result);

    return result;
}

这些是输入值和结果值:

Variable         VC++ value         Java value
m_dLatRadians    0.896808347        0.896808378
m_dLongRadians  -0.047414778(0)    -0.047414778(6)
dLatRadians      0.896192633(9)     0.896192588(9)
dLongRadians    -0.026897463       -0.026897463
r4               1.000218106        1.0002181433
dResult/result   0.999917766        1.0002181433

谁能建议为什么 r4 和 dResult 在 Visual C++ 版本中应该不同?

附言我从 VC++ 版本获得了良好的最终距离结果,而从 Java 获得了糟糕的最终结果——几乎所有的距离都为零(调用这些例程的高级代码没有显示,因为它有很多!然而这是我的差异我有兴趣了解)。

最佳答案

在 C++ 代码中

cos(m_dLatRadians) * cos(dLatRadians)

应该是

cos(dLatRadians) * cos(dLatRadians)

r2 = r3 * r3; 保持一致并匹配您在 Java 中所做的事情。

另外,作为 @CaseyB指出,dLatRadians 参数不同(m_dLatRadians 也是如此)。

关于java - VC++ 与 Java 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12502770/

相关文章:

android - 想要为Android上的错误弹出消息

c++ - VC++ Winforms 自动生成的项目无法调试 VS2010 : "This Project is out of Date"

c++ - varargs(va_list va_start) 不适用于传递引用参数

android - 多个 Activity APN

android - 将字符串从 Android Java Activity 传递到广播接收器

c++ - 我可以要求 VC++ 链接器忽略未解析的外部吗?

java - 在java中设置和获取方法?

java - Android ListView 和 Intent

java - 对 Date 对象进行空检查

java - 分离饼图的各个部分