2016-08-25 2 views
2

J'ai deux nombres à virgule flottante et je veux calculer leur différence en unités en dernier lieu (ULP). En Java, ceci est:Quel est l'équivalent perl de Double.doubleToLongBits() de Java?

Double.doubleToLongBits(a) - Double.doubleToLongBits(b) 

Quel est l'équivalent en Perl?

+0

Le résultat de 'Double.doubleToLongBits()' inclut le signe et l'exposant. Cette méthode peut échouer si 'a' et' b' ont des valeurs d'exposant différentes. –

+0

@KeithThompson true ce n'est plus des multiples de l'unité à la dernière place mais c'est une mesure de précision en virgule flottante. C'est à dire. combien de nombres sont entre a et b. – Evan

Répondre

3

Sur Perl avec double précision flotteurs [1] et entiers non signés au moins 64 bits taille [2], vous pouvez utiliser les éléments suivants:

unpack('Q', pack('d', $n)) 

Par exemple,

$ perl -e' 
    use Config qw(%Config); 

    die("Not supported\n") 
     if $Config{nvsize} != 8 
     || $Config{uvsize} < 8; 

    printf("%X\n", unpack("Q", pack("d", -0.1))); 
' 
BFB999999999999A 

  1. perl -V:nvsize donne 8
  2. perl -V:uvsize donne 8 ou plus