Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Conversion long signé en double

1 réponse
Avatar
Xavier
Bonjour à tous,

En Java, les nombres sont signés. OK

En dialogant avec un équipement, imaginons que je puisse récupérer une
valeur sur 64 bits. Je la stocke dans un long, 64 bits en Java. Puis je veux
la transférer dans un double. OK

Maintenant, je sais que cette valeur peut n'être composée que de bit à 1 et
est non signée : 0xFFFF.....FFFFF. Là, le problème apparait, car pour Java,
cette valeur est signé et vaut donc -1. Une fois transférée dans mon double,
j'ai -1 au lieu d'avoir ~18E18.

Ma question est donc : comment arriver avec la valeur correcte dans mon
double ?

J'ai fait un bout de code de test :

long aLongNumber = 0x7FFFFFFFFFFFFFFFL;
System.out.println("aLongNumber = 0x"+Long.toHexString(aLongNumber)+
" = "+(aLongNumber & 0xFFFFFFFFFFFFFFFFL));
System.out.println("aLongNumber * 2 = 0x"+
Long.toHexString(aLongNumber*2)+
" = "+((aLongNumber*2) & 0xFFFFFFFFFFFFFFFFL));
System.out.println("aLongNumber + 1 = 0x"+
Long.toHexString(aLongNumber+1)+" = "+
((aLongNumber+1) & 0xFFFFFFFFFFFFFFFFL));
long anotherLongNumber = aLongNumber+1;
System.out.println("anotherLongNumber = 0x"+
Long.toHexString(anotherLongNumber)+" = "+
(anotherLongNumber & 0xFFFFFFFFFFFFFFFFL));
double aDoubleNumber = aLongNumber;
System.out.println("aDoubleNumber = "+aDoubleNumber);
System.out.println("aDoubleNumber * 2 = "+(aDoubleNumber*2));
System.out.println("aDoubleNumber + 1 = "+(aDoubleNumber+1));

Le résultat est le suivant :

aLongNumber = 0x7fffffffffffffff = 9223372036854775807
aLongNumber * 2 = 0xfffffffffffffffe = -2
aLongNumber + 1 = 0x8000000000000000 = -9223372036854775808
anotherLongNumber = 0x8000000000000000 = -9223372036854775808
aDoubleNumber = 9.223372036854776E18
aDoubleNumber * 2 = 1.8446744073709552E19
aDoubleNumber + 1 = 9.223372036854776E18

La variable aLongNumber est initialisée avec la valeur max pour un long. Si
je fais +1 ou *2, je passe en négatif. anotherLongNumber est négatif.

Ce qui m'intéresse, c'est de trouver une solution pour transférer
anotherLongNumber dans un double en le considérant comme signé.

Une idée ?

Merci

Xavier

1 réponse

Avatar
Hervé AGNOUX
Xavier wrote:


Une idée ?



Je n'ai pas tout suivi, mais peut être pourrais-tu trouver ton bonheur avec
java.math.BigInteger / BigDecimal. Ils semblent avoir pensé à ce genre de
problème.

Et puis peut être aussi Commons Math, mais on sort du jdk :
http://jakarta.apache.org/commons/math/

Cordialement.


--
Hervé AGNOUX
http://www.diaam-informatique.com