根据Matlab documentation,当Java方法返回 long
时,它将在Matlab中分配之前转换为 double
.
精度已经丧失 . 我对Java方法返回的 long
的低位感兴趣 . double
不能代表它们,但Matlab的 int64
可以 . (通过考虑两种类型都有64位,并且 double
使用其中一些来表示指数,这很清楚 . )
如果我控制了Java代码,我可以返回一个包含 long
的元素的数组 - 在这种情况下,Matlab将它们保存为 int64
,但在我的情况下,我正在调用库函数 .
目前,我能看到的最好的方法是用Java编写一个包装器,它将调用该方法并在数组中返回答案 . 但是这种方法存在可移植性问题 . 有没有更好的办法?
2 回答
它在评论中得到了基本的回答,但为了完整性,将Java
long
作为int64
无损的方式接收到Matlab的最佳方法似乎是编写一个小的Java包装器,它调用你拥有的任何方法并在long[]
中返回响应 .(如果要分发代码,请考虑使用比最新版本更早的目标JVM版本编译该Java类 - 否则某些用户将被迫升级其JVM以运行您的软件,其中一些用户将不会管理员权限这样做 . )
如果您的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' sint64
. 该范围内的所有整数都可以表示为double
数字而不会丢失精度,因为该值可以存储在由double
值的64位表示形式提供的53位有效二进制数字中 .您可以在我的书Code Quality: The Open Source Perspective的第8章(浮点运算)或任何其他涵盖浮点运算的教科书中找到更多详细信息 .
以下程序演示了精确可表示范围结束时1亿个整数的
double
表示的准确性 .