matlab - 如何从返回 long 的 Java 方法获取 int64?

2022-09-01 12:17:54

根据 Matlab 文档,当 Java 方法返回 a 时,它会在 Matlab 中被赋值之前转换为 a。longdouble

精度已经丢失。我对Java方法返回的较低数字感兴趣。A 不能代表它们,但 Matlab 可以。(考虑到两种类型都有 64 位,并且 a 使用其中一些位来表示指数,这一点很清楚。longdoubleint64double

如果我控制了Java代码,我可以返回一个包含一个元素的数组,其中包含 - 在这种情况下,Matlab将它们保留为s,但在我的情况下,我调用的是库函数。longint64

目前,我能看到的最好的方法是用Java编写一个包装器,它将调用该方法并在数组中返回答案。但这种方法存在可移植性问题。有没有更好的方法?


答案 1

如果 Java 方法返回的结果在 [-9,007,199,254,740,992 到 9,007,199,254,740,992] 范围内,则根本不需要在代码中执行任何操作。您可以将结果转换回 Matlab 的 ,而不会损失任何精度。该范围内的所有整数都可以表示为数字而不会降低精度,因为该值可以存储在值的 64 位表示形式提供的 53 位有效二进制数字中。longint64doubledouble

你可以在我的书《代码质量:开源视角》(Code Quality: The Open Source Perspective)或任何其他涵盖浮点算术的教科书的第8章(浮点算术)中找到更多细节。

下面的程序演示了精确可表示范围末尾的 1 亿个整数的表示的准确性。double

#include <stdio.h>

int
main(int argc, char *argv[])
{
    int i;
    volatile long long n1, n2;
    volatile long long p1, p2;
    volatile double d;

    /* Include one number outside the range, to show that the test works. */
    n1 = -9007199254740993ll;
    p1 =  9007199254740993ll;
    for (i = 0; i < 100000000; i++) {
        d = p1;
        p2 = d;
        if (p1 != p2)
            printf("%lld != %lld\n", p1, p2);

        d = n1;
        n2 = d;
        if (n1 != n2)
            printf("%lld != %lld\n", n1, n2);
        p1--;
        n1++;
    }
    return 0;
}

答案 2

它基本上已经在评论中得到了回答,但为了完整性,将Java接收到Matlab中的最佳方法似乎是编写一个小的Java包装器,该包装器调用您拥有的任何方法并在.longint64long[]

(如果要分发代码,请考虑使用比最新版本早一些的目标JVM版本编译该Java类 - 否则一些用户将被迫升级他们的JVM以运行您的软件,其中一些用户将没有管理员权限来执行此操作。