Java: converti binario in virgola mobile in virgola mobile decimale


Voglio convertire una stringa che rappresenta la porzione mantissa di un doppio IEEE754. Impossibile trovare se esiste un tale metodo di conversione in Java, per evitare di aggiungere manualmente 1 + 1/2 + 1/4 + 1/8 ecc.

|0100000011001010000111110000000000000000000000000000000000000000 --> 13374 in IEEE754 |------------1010000111110000000000000000000000000000000000000000 > > mantissa parte | 1.1010000111110000000000000000000000000000000000000000 > > ripristino del valore fisso 1

String s = "1.1010000111110000000000000000000000000000000000000000"
double mant10 = Double.readFromFloatBinary(s); // does such method exists in Java?
Author: mins, 2014-04-27

1 answers

Sì, ci sono modi per leggere da una rappresentazione binaria. Ma non hai una rappresentazione in un formato IEEE.

Ignorerei il punto e leggerei come BigInteger base2, quindi creerei un valore da dividere anche usando BigInteger:

private static double binaryStringToDouble(String s) {
    return stringToDouble(s, 2);
}

private static double stringToDouble(String s, int base) {
    String withoutPeriod = s.replace(".", "");
    double value = new BigInteger(withoutPeriod, base).doubleValue();
    String binaryDivisor = "1" + s.split("\\.")[1].replace("1", "0");
    double divisor = new BigInteger(binaryDivisor, base).doubleValue();
    return value / divisor;
}

@Test
public void test_one_point_5() {
    String s = "1.1";
    double d = binaryStringToDouble(s);
    assertEquals(1.5, d, 0.0001);
}

@Test
public void test_6_8125() {
    String s = "110.1101";
    double d = binaryStringToDouble(s);
    assertEquals(6.8125, d, 0.0001);
}

@Test
public void test_yours() {
    String s = "1.1010000111110000000000000000000000000000000000000000";
    double d = binaryStringToDouble(s);
    assertEquals(1.632568359375, d, 0.000000000000000001);
}

@Test
public void test_yours_no_trailing_zeros() {
    String s = "1.101000011111";
    double d = binaryStringToDouble(s);
    assertEquals(1.632568359375, d, 0.000000000000000001);
}
 2
Author: weston, 2014-04-27 16:20:03