big --> little returns NaN
-
Hallo zusammen,
ich habe eine Klasse geschrieben, die int/double Werte von big nach little und verkehrt herum umwandelt. Dies funktionierte auch problemlos, bis ich versuchte den Wert 27.842803 in little umzuwandeln. Hier bekam ich not A Number zurück. Muss ich hier den Informationsverlust in Kauf nehmen (z.B. Änderung der letzten Kommastelle etc.) ?
public class EndianTest { public static int[] convertLittle2Big(int value) { int[] little = new int[4]; little[3] = ((value & 0xff000000) >>> 24); // & 0x000000ff; //im Kommentar: Alternative; letzter Byte hat das Vorzeichen little[2] = ((value & 0x00ff0000) >> 8); little[1] = ((value & 0x0000ff00) << 8); little[0] = ((value & 0x000000ff) << 24); return little; } public static int getValue(int[] value) { int result = 0; for(int i=0; i<value.length;i++) { result |= value[i]; } return result; } public static long swapAndMergeIntValues(int int_val1, int int_val2) { long x = (long) int_val1; long y = (long) int_val2; long new_long_value = (y << 32) | ((x << 32) >>> 32); //tauschen; x wegen dem Vorzeichen verschieben return new_long_value; } /*zerlegt einen Long in 2 ints und liefert sie in little-Anordnung zurück*/ public static int[] decomposeLong(long val) { int new_int_values[] = new int[2]; long x = (int) (val) ; //nur die untersten 4 Byte long y = (int) (val >>> 32); //die obersten zuerst verschieben, damit die untersten gelesen werden können (ohne das Vorzeichen) //gleich tauschen ! long int_val1 = y; long int_val2 = x; new_int_values[0] = (int) int_val1; new_int_values[1] = (int) int_val2; return new_int_values; } //wandelt big-->little public static double getTransformedDoubleValue(double dBig) { double dLittle; long lBig = Double.doubleToLongBits(dBig); int[] little = new int[2]; little = ByteReader.decomposeLong(lBig); //im little-Format, nur zerlegt int l1 = ByteReader.getValue(ByteReader.convertLittle2Big(little[0])); //im big int l2 = ByteReader.getValue(ByteReader.convertLittle2Big(little[1])); //im big long mergeInts = ByteReader.swapAndMergeIntValues(l1, l2); //noch tauschen und verbinden dLittle = Double.longBitsToDouble(mergeInts); //umwandeln return dLittle; } public static void main(String[] args) { System.out.println(EndianTest.getTransformedDoubleValue(27.842803)); //NaN ! System.out.println(EndianTest.getTransformedDoubleValue(27.842802)); //ok } }
Danke im Voraus.
-
... also um euch das Lesen des ganzen Blödsinns zu ersparen... es geht nur darum warum der Wert 9221395045185698624 als double nicht dargestellt werden kann.
thx
Kati
-
Deine Zahl hat vier Ziffern zuviel. double kann maximal 1.7*10^308 darstellen (das sind 15 Ziffern)
-
jo, verwirrend ist nur, dass es bis jetzt nie der Fall war, erst wenn ich versuche die Zahl 27.842803 umzuwandeln... es gibt anscheinend mehrere gefährliche Zahlen, bei den man aufpassen muss. Ich schau' mir den Code nochmal an, aber wie gesagt... bis jetzt Unmengen an Daten getestet..alles richtig gewesen
kati