matlab-¿Cómo obtener int64 desde un método Java devolviendo un largo?
type-conversion (2)
En esencia, se ha respondido en los comentarios, pero para completar, la mejor forma de recibir un Java long
en Matlab como int64
ileso parece escribir un pequeño contenedor Java que llama a cualquier método que tengas y devuelve la respuesta en un long[]
.
(Si se va a distribuir el código, considere compilar esa clase Java con una versión JVM objetivo que sea algo anterior a la última; de lo contrario, algunos usuarios se verán obligados a actualizar su JVM para ejecutar su software, y algunos de ellos no tendrán derechos de administrador para hacer eso).
De acuerdo con la documentación de Matlab , cuando un método Java devuelve una long
, se convierte a un double
antes de ser asignado en Matlab.
La precisión se ha perdido. Estoy interesado en los dígitos más bajos de los long
devueltos por el método de Java. Un double
no puede representarlos, pero el int64
de Matlab puede. (Esto es claro al considerar que ambos tipos tienen 64 bits, y un double
usa algunos de ellos para representar el exponente).
Si tuviera el control del código Java, podría devolver una matriz con un elemento, que contiene el long
, en este caso Matlab los mantiene como int64
s, pero en mi caso estoy llamando a una función de biblioteca.
Actualmente, la mejor manera que puedo ver es escribir un contenedor en Java que llamará al método y devolverá la respuesta en una matriz. Pero hay problemas de portabilidad con este enfoque. ¿Hay una mejor manera?
Si los resultados long
que devuelve su método Java están en el rango [-9,007,199,254,740,992 a 9,007,199,254,740,992], entonces no necesita hacer nada en absoluto en su código. Puede convertir el resultado a int64
de Matlab, sin pérdida de precisión. Todos los enteros en ese rango se pueden representar como números double
sin pérdida de precisión, porque el valor se puede almacenar en los dígitos binarios significativos de 53 bits que ofrece la representación de 64 bits de los valores double
.
Puede encontrar más detalles en el Capítulo 8 (Aritmética de punto flotante) de mi libro Calidad de código: La perspectiva de código abierto o cualquier otro libro de texto que abarque la aritmética de coma flotante.
El siguiente programa demuestra la precisión de la representación double
para los 100 millones de enteros al final del rango exactamente representable.
#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;
}