28 votes

matlab - Comment obtenir int64 d'une méthode Java renvoyant un long?

Selon la documentation Matlab, quand une méthode en Java renvoie une long, il est converti en double avant d'être affecté dans Matlab.

La précision a été perdu. Je suis intéressé par la baisse des chiffres de l' long retournée par la méthode Java. Un double ne peut pas les représenter, mais Matlab int64 peut. (C'est clair, en considérant que les deux types ont des 64 bits, et un double utilise certains d'entre eux pour représenter l'exposant.)

Si j'avais le contrôle du code Java, je pourrais retourner un tableau avec un seul élément, contenant l' long - dans ce cas, Matlab garde que int64s, mais dans mon cas, je suis d'appeler une fonction de la bibliothèque.

Actuellement, la meilleure façon que je peux voir, c'est d'écrire un wrapper en Java qui va appeler la méthode et retourner la réponse dans un tableau. Mais il y a des problèmes de portabilité avec cette approche. Est-il un meilleur moyen?

3voto

Diomidis Spinellis Points 8417

Si l' long résultats que votre méthode en Java les rendements sont dans l'intervalle [-9,007,199,254,740,992 à 9,007,199,254,740,992], alors vous n'avez pas besoin de faire quoi que ce soit dans votre code. Vous pouvez convertir le résultat en Matlab int64, sans aucune perte de précision. Tous les entiers dans cette gamme peut être représenté comme double le nombre sans perte de précision, car la valeur peut être stockée dans le 53 bits significatifs de chiffres binaires offertes par la version 64 bits de la représentation de l' double valeurs.

Vous pouvez trouver plus de détails dans le Chapitre 8 (l'Arithmétique à virgule Flottante) de mon livre de la Qualité du Code: L'Open Source, de Perspective ou de tout autre manuel couvrant l'arithmétique à virgule flottante.

Le programme suivant illustre l'exactitude de l' double pour la représentation des 100 millions d'entiers à la fin de la exactement représentable gamme.

#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;
}

0voto

Evgeni Sergeev Points 1517

C'est essentiellement été répondu dans les commentaires, mais juste pour être complet, la meilleure façon de recevoir un Java long en Matlab comme int64 sains et saufs ne semble pas être l'écriture d'un petit wrapper Java qui appelle quelle que soit la méthode que vous avez et renvoie la réponse à une long[].

(Si le code est distribué, envisager de compiler cette classe Java avec une cible JVM version qui est un peu plus tôt que plus tard, au contraire de certains utilisateurs seront obligés de mettre à niveau leur JVM pour exécuter votre logiciel, et certains de ceux qui n'avez pas les droits d'admin pour le faire.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X