首页 文章

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

提问于
浏览
28

根据Matlab documentation,当Java方法返回 long 时,它将在Matlab中分配之前转换为 double .

精度已经丧失 . 我对Java方法返回的 long 的低位感兴趣 . double 不能代表它们,但Matlab的 int64 可以 . (通过考虑两种类型都有64位,并且 double 使用其中一些来表示指数,这很清楚 . )

如果我控制了Java代码,我可以返回一个包含 long 的元素的数组 - 在这种情况下,Matlab将它们保存为 int64 ,但在我的情况下,我正在调用库函数 .

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

2 回答

  • 0

    它在评论中得到了基本的回答,但为了完整性,将Java long 作为 int64 无损的方式接收到Matlab的最佳方法似乎是编写一个小的Java包装器,它调用你拥有的任何方法并在 long[] 中返回响应 .

    (如果要分发代码,请考虑使用比最新版本更早的目标JVM版本编译该Java类 - 否则某些用户将被迫升级其JVM以运行您的软件,其中一些用户将不会管理员权限这样做 . )

  • 3

    如果您的Java方法返回的 long 结果在[-9,007,199,254,740,992到9,007,199,254,740,992]的范围内,那么您不需要精确地丢失't need to do anything at all in your code. You can convert the result back to Matlab' s int64 . 该范围内的所有整数都可以表示为 double 数字而不会丢失精度,因为该值可以存储在由 double 值的64位表示形式提供的53位有效二进制数字中 .

    您可以在我的书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;
    }
    

相关问题