2013-05-01 2 views
28

Matlab documentation에 따르면 Java 메서드가 long을 반환하면 Matlab에 할당되기 전에 double으로 변환됩니다.matlab - 길이를 반환하는 Java 메소드에서 int64를 가져 오는 방법은 무엇입니까?

정밀도가 손실되었습니다. Java 메서드에서 반환 된 long의 하위 자리에 관심이 있습니다. double은이를 나타낼 수 없지만 Matlab의 int64 수 있습니다. (이것은 두 유형 모두 64 비트를 가졌음을 고려하면 분명하며 double은 지수 중 일부를 사용하여 지수를 나타냅니다.)

Java 코드를 제어 할 수있는 경우, long -이 경우 Matlab은 int64으로 유지하지만 제 경우에는 라이브러리 함수를 호출합니다.

현재 내가 볼 수있는 가장 좋은 방법은 메서드를 호출하고 배열에서 응답을 반환하는 Java에서 래퍼를 작성하는 것입니다. 그러나이 접근법에는 이식성 문제가 있습니다. 더 좋은 방법이 있습니까?

+0

Yikes, 좋은 정보. 나는 int64s를 앞뒤로 돌아 다니는 프로젝트를 가지고 있으며, 이것을 점검하고 점검해야 할 것이다. – JonB

+0

한 가지 생각 - long이 아닌 java.lang.Long을 반환하면 (matlab에서) .toString()을 수행하고 그 결과를 문자열로 가져 와서 matlab에서 다시 변환 할 수 있습니다. – JonB

+0

즉 Matlab은 sscanf (char (wrapperFun(). toString), '% ld')를 사용하여 int64를 가져올 수 있습니다. – JonB

답변

0

그것은 본질적으로 코멘트에 응답 한,하지만 단지 완성도, 무사 int64로 matlab에로 자바 long을받을 수있는 가장 좋은 방법은 당신이 돌아갑니다 어떤 방법을 호출하는 작은 자바 래퍼를 작성하는 것처럼 보인다 응답은 long[]입니다.

(코드를 배포하려는 경우 대상 JVM 버전을 최신 버전보다 약간 더 늦게 컴파일하는 것이 좋습니다. 그렇지 않으면 일부 사용자는 소프트웨어를 실행하기 위해 JVM을 업그레이드해야하며 일부는 이를 수행 할 수있는 관리자 권한이 없습니다.)

3

Java 메소드가 반환하는 결과가 long 인 경우 [-9,007199254740,992 ~ 9,007199254740,992]의 범위에있는 경우 코드에서 아무 것도 수행 할 필요가 없습니다. 정밀도를 잃지 않고 결과를 다시 Matlab의 int64으로 변환 할 수 있습니다. 이 범위의 모든 정수는 double 값의 64 비트 표현에 의해 제공되는 53 비트 유효 2 진수에 값을 저장할 수 있기 때문에 정확도를 잃지 않고 double 숫자로 나타낼 수 있습니다.

내 책 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; 
} 
+0

잘 알고 있습니다. 예를 들어, 1970 년 이래로 나노초의 숫자가 그 숫자보다 많기 때문에 (이것은 사실상 질문을 게시하게 된 원인입니다) 일반적으로 픽셀을 팩 할 수 있기 때문에 결코 잊을 수없는 해결책은 아닙니다 매일 매일의 상황이 아닌, 때때로 일어날 수있는 일이 있습니다. –

+0

또한, 나는'volatile'이 멀티 스레드 코드에서만 도움이된다고 생각 했습니까? –

+0

'volatile'은 컴파일러가 해당 변수와 관련된 코드를 최적화하지 않도록 지시합니다. 그것 없이는 영리한 최적화 컴파일러는 유용하지 않은 코드를 최적화 할 수 있습니다. –

관련 문제