Java: convertir un binaire à virgule flottante en décimal à virgule flottante


Je veux convertir une chaîne représentant la partie mantisse d'un double IEEE754. Impossible de trouver s'il existe une telle méthode de conversion en Java, afin d'éviter d'ajouter manuellement 1 + 1/2 + 1/4 + 1/8 etc.

|0100000011001010000111110000000000000000000000000000000000000000 --> 13374 dans IEEE754 |------------1010000111110000000000000000000000000000000000000000 > > partie mantisse | 1.1010000111110000000000000000000000000000000000000000 > > restaurer la valeur fixe 1

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

1 answers

Oui, il existe des moyens de lire à partir d'une représentation binaire. Mais vous n'avez pas de représentation dans un format IEEE.

J'ignorerais la période et lirais comme un BigInteger base2, puis créerais une valeur à diviser en utilisant également 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