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


Anmelden zum Antworten