Bonjour,

Je suis conscient qu'un double ne peut contenir un long quelconque de manière bijective, lorsque ce long est stocké dans la partie entière du double.

Par contre, il me semble que Double.longBitsToDouble et Double.doubleToRawLongBits permettent une bijection (vu que les 2 types primitifs sont stockés sur le même nombre de bits).
- Pourriez vous confirmer que cette méthode est effectivement une bijection (cf exemple ci dessous)
- Ce qui me choque, c'est que l'opération est compatible avec la somme de double (voir les 3 dernieres lignes ci dessous). Est-ce que je peux compter sur ce comportement (ie ne pas avoir a repasser en long pour sommer) ? Avec vous une explication pour ce phénomène ?

Merci d'avance pour vos lumières.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
       public static long lng2lng(long x) {
		// long y = Double.doubleToLongBits(Double.longBitsToDouble(x));
		long y = Double.doubleToRawLongBits(Double.longBitsToDouble(x));
		if (x !=y) System.out.printf("%s != %s !",x ,y);
		return y;
	}
	public static void main(String[] args) {
 
		lng2lng(Long.MAX_VALUE);
		lng2lng(Long.MIN_VALUE);
		lng2lng(1246l);
		lng2lng(0);
		lng2lng(-1);
 
		System.out.println(Double.longBitsToDouble(1)); 
		System.out.println(Double.longBitsToDouble(1000)); 
		System.out.println(Double.doubleToRawLongBits(Double.longBitsToDouble(1)+Double.longBitsToDouble(1000))); // wahou !
 
 
	}