首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中将IEEE-754二进制表示字符串转换为浮点数或双值表示字符串?

如何在Java中将IEEE-754二进制表示字符串转换为浮点数或双值表示字符串?
EN

Stack Overflow用户
提问于 2018-07-16 22:48:39
回答 2查看 2.5K关注 0票数 3

由于所有Java浮点数,即浮点数和双浮点数,都在内部表示为位,所以我希望找到一个高效的算法来转换表示浮点数或双浮点数的字符串,并将其转换为相应的浮点数--我无法为它找到内置的库函数,所以我只好自己编写它。

长度为32的二进制字符串表示浮点数,其中长度为64的二进制字符串将转换为双字符串。所有浮动可以转换成双倍,而不会失去准确性。空格被忽略。

示例

  • "0 10000000 10010010000111111011011"以浮点数的形式变成3.141592
  • "1 11111111 00000000000000000000000"变成-infinity
  • "0 11111111 10010010000111111011011"变成了浮点NaN
  • "1 10000000000 0101101111110000101010001011000101000101011101101001" 成为与-e最接近的双值,即2.71828182845904509079559829843

到目前为止,我有大量的代码:

代码语言:javascript
复制
public static double ieee(String binString) throws Exception {
    binString = binString.replace(" ", "");
    if (binString.length() == 32) {
        String exponentB = binString.substring(1, 9);
        String mantissaB = binString.substring(9, 32);
        int sgn = binString.charAt(0) == '0' ? 1 : -1;
        int exponent = Integer.parseInt(exponentB, 2) - 127; // Biased by 127
        double mantissa = 1 + Integer.parseInt(mantissaB, 2) / Math.pow(2, 23);

        if (exponent == 128 && mantissa == 1)
            return sgn == 1 ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
        if (exponent == 128 && mantissa != 0)
            return Double.NaN;
        if (exponent == -127)
            return sgn*Math.pow(2,-126)*(mantissa - 1);
        return sgn*Math.pow(2, exponent)*mantissa;
    }
    else if (binString.length() == 64) {
        String exponentB = binString.substring(1, 12);
        String mantissaB = binString.substring(12, 64);
        int sgn = binString.charAt(0) == '0' ? 1 : -1;
        int exponent = Integer.parseInt(exponentB, 2) - 1023; // Biased by 1023
        double mantissa = 1 + Long.parseLong(mantissaB, 2) / Math.pow(2, 52);

        if (exponent == 1024 && mantissa == 1)
            return sgn == 1 ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
        if (exponent == 1024 && mantissa != 0)
            return Double.NaN;
        if (exponent == -1023)
            return sgn*Math.pow(2,-1022)*(mantissa - 1);
        return sgn*Math.pow(2, exponent)*mantissa;
    }
    else {
        throw new Exception("Does not represent internal bits of a floating-point number");
    }
}

虽然到目前为止,我的代码还在工作,但是从代码的速度和数量来看,有什么最简洁或最快的方法来将IEEE-754二进制表示字符串转换为它的floatdouble?最有效的方法,并能很好地解释其效率和专门知识,是首选。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-16 23:02:59

这种方法可能更有效。当然,它更简单,更易于维护。

  1. 从字符串中删除空格
  2. 验证字符串长度..。
  3. 将二进制字符串转换为int
  4. 调用Float.intBitsToFloat(int)将其转换为float

对于双倍,请使用long和等效的Double方法。

简化的代码是否更有效?

唯一确定的方法是对其进行基准测试。但是根据你的代码所做的,我相信是这样的。

票数 6
EN

Stack Overflow用户

发布于 2022-06-22 06:58:50

代码语言:javascript
复制
public class IEEE754ToFloatingValues {

public static double convertToInt(String mantissa_str) {
    
    int power_count = -1;
    double mantissa_int = 0.0;
    for (int i = 0; i < mantissa_str.length(); i++) {
        // System.out.print(Integer.parseInt(mantissa_str.charAt(i) + ""));
        mantissa_int += (Integer.parseInt(mantissa_str.charAt(i) + "") * Math.pow(2, power_count));
        power_count -= 1;
    }
    return mantissa_int + 1.0;
}

public static String convertToBinary(int i) {
    
    return Integer.toBinaryString(i + 0b10000).substring(1);
}

public static String decimalToHex(String decimal) {

    int i = Integer.parseInt(decimal);
    System.out.println("<<>>" + i);
    String my_hexdata = Integer.toHexString(i);

    System.out.println(my_hexdata);

    return String.valueOf(ReturnFloatingValue(my_hexdata));

}

public static double ReturnFloatingValue(String my_hexdata) {

    String myString = "";
    if (my_hexdata == null) {
        return -2.0;
    }
    if (my_hexdata.length() != 8) {
        myString = String.format("%1$-" + 8 + "s", my_hexdata).replace(' ', '0');

        System.out.println("My hex data after appending 0's is : " + myString);
    }

    String binary = "";
    for (int i = 0; i < myString.length(); i++) {
        int num = Integer.parseInt(myString.charAt(i) + "", 16);
        binary += convertToBinary(num);
    }

    System.out.println("Binary length is :  " + binary.length());

    System.out.println("Binary number is : " + binary);
    if (binary == null || binary.isEmpty()) {
        return -3.0;
    }
    String ieee_32 = binary.substring(2);

    ieee_32 = String.format("%1$-32s", binary).replace(' ', '0');

    long sign_bit = Long.parseLong(new StringBuilder().append(ieee_32.charAt(0)).toString());

    long exponent_bias = Long.parseLong(ieee_32.substring(1, 9), 2);
    long exponent_unbias = exponent_bias - 127L;

    System.out.println("Exponent unbias is  : " + exponent_unbias);
    String mantissa_str = ieee_32.substring(9);
    double mantissa_int = convertToInt(mantissa_str);
    double real_no = Math.pow(-1.0, (double) sign_bit) * mantissa_int * Math.pow(2.0, (double) exponent_unbias);

    System.out.println("Real no is : " + real_no);
    return real_no;
}

public static void main(String[] args) {

    //decimalToHex("16547");
}

}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51371033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档