2013-05-01 88 views
28

根據Matlab documentation,當Java方法返回一個long,它是在Matlab被分配之前被轉換爲一doublematlab - 如何從一個Java方法返回int64 int64?

精密已丟失。我感興趣的是由Java方法返回的long的低位數字。 A double不能代表它們,但Matlab的int64可以。 (考慮到這兩種類型都有64位,並且double使用其中的一些來表示指數,這是很明顯的。)

如果我控制了Java代碼,我可以返回一個包含一個元素的數組, long - 在這種情況下,Matlab將它們保存爲int64,但在我的情況下,我正在調用庫函數。

目前,我能看到的是用Java編寫的包裝,將調用該方法,並在一個數組返回答案的最佳途徑。但這種方法存在可移植性問題。有沒有更好的辦法?

+0

Yikes,很好的信息。我有一個項目來回傳遞int64s,我需要回來檢查一下! – JonB 2013-05-01 06:53:54

+0

一個想法 - 如果你返回一個java.lang.Long而不是long,你可以(在matlab中)做.toString()並把結果作爲一個字符串,然後轉換回matlab。 – JonB 2013-05-01 07:07:47

+0

即Matlab可以通過使用sscanf(char(wrapperFun()。toString),'%ld')得到int64。 – JonB 2013-05-01 07:23:22

回答

0

它的意見基本得到回答,只是爲了完整性,收到一個Java long到Matlab作爲int64一劫的最佳途徑似乎要編寫一個小的Java包裝這就要求你必須返回任何方法在long[]的響應。 (如果要分發代碼,請考慮使用比最新更早的目標JVM版本編譯該Java類 - 否則某些用戶將被迫升級其JVM以運行您的軟件,並且其中一些將沒有管理員權限來執行此操作。)

3

如果您的Java方法返回的long結果在[-9,007,199,254,740,992至9,007,199,254,740,992]的範圍內,那麼您不需要在代碼中執行任何操作。您可以將結果轉換回Matlab的int64,而不會有任何精度損失。該範圍內的所有整數都可以表示爲double數字,而不會降低精度,因爲該值可以存儲在64位表示double值所提供的53位有效二進制數字中。

您可以在第8章的詳細信息(浮點運算),我的書Code Quality: The Open Source Perspective或任何其他教科書覆蓋浮點運算。

下面的程序演示用於在完全表示範圍的端部100個百萬個整數的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; 
} 
+0

很高興知道。它不是一個「一勞永逸」的解決方案,因爲例如自1970年代以來的納秒數大於該數(這實際上導致發佈該問題),並且通常可以將像素或者將其他一些數據包含進去 - 不是每天的情況,但可能會不時發生。 – 2013-05-26 08:16:13

+0

此外,我認爲'volatile's只能幫助多線程代碼? – 2013-05-26 08:17:01

+0

'volatile'指示編譯器避免優化與該變量相關的代碼。沒有它,一個聰明的優化編譯器可以優化掉我的部分代碼,因爲它們沒有做任何有用的事情。 – 2013-05-27 20:43:35

相關問題