提问者:小点点

将十进制转换为IEEE二进制


我正在尝试将数字从十进制值转换为其IEEE 752形式。例如:

+43.9542 -> 01000010001011111101000100011010
-43.9542 -> 11000010001011111101000100011010

我写了这个方法:

public float GetFloat32(String numero) {  

        //Convert
        int intBits = Integer.parseInt(numero, 2);
        float myFloat = Float.intBitsToFloat(intBits);

        //Exponent
        getExponent = 127 + (String.valueOf(Integer.toBinaryString(Math.abs((int) myFloat))).length() - 1);

        //Sign
        getSign = (myFloat < 0) ? 1 : 0;

        return myFloat;
    } 

有个问题我解决不了,我再举个例子说清楚。

double a = k.GetFloat32("01000010001011111101000100011010")
a = 43.9542

但是当数字为负数时,例如

double a = k.GetFloat32("1000010001011111101000100011010")

我收到以下错误:

这意味着我的代码可以完美地处理正数(包括零),但如果是负数,代码就会崩溃。问题出在哪里?

笔记

我想我可以用这种方式解决我的问题

  1. 检查字符串数字是否有一个字符At(0)等于1
  2. 如果是(numero.charAt(0)==1),则删除第一个字符
  3. 使用新号码(不带1)调用GetFloat32()
  4. 返回结果,在num前面添加-

这可能有效,但我想知道上述方法中的问题在哪里。如果可能的话,我宁愿避免这种解决方案。


共3个答案

匿名用户

问题是int/intger的上限是0x7FFF_FFFF,所以Integer.parseInt方法不会超过这个限制。

使用Long。parseLong,检查结果值是否超过0x7FFF\u ffffffl,并根据负整数值所需的逻辑进行处理。

虽然,我不认为你自己的想法有什么不好的,那就是剥离符号位,处理其余的以获得绝对值。

编辑无法通过从位字符串进行简单的整数转换来获取编码的浮点。只要考虑一下,根据2的补码表示法,32个二进制数字中的1和-1在不止一位上有所不同,而100。。。。000不是-0。有符号震级与2的补码不同。此外,Java的二进制和十六进制(或任何其他基)文本都是正数;如果需要负值,请使用符号。

后面的方法整数。parseUnsignedInt没有使用Long的优势,因为接下来您必须知道如何使用2的补码算法删除前导(符号)位以生成绝对值,然后将其拆分为指数和尾数。(加或减整数。MIN\u值。)

如果没有IEEE 752,而IEEE 754是目标格式,那么最简单的格式是

float f1 = Float.intBitsToFloat(Integer.parseUnsignedInt(numerio,2));

匿名用户

公共类IEEE754tocolatingvalue{

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;
    }

    IEEE754ToFloatingValues.logger.info((Object) "IEEE754ToFloatingValues : convertToInt :: end");

    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),    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("0");
}

}

匿名用户

import java.util.*;

public class IEEE754 {

    public static void main(String[] args) {

        float floa;

        Scanner sc = new Scanner(System.in);

        System.out.println("ENTER A FLOATING POINT NUMBER");

        floa=sc.nextFloat();

        int no,sign;

        no=(int) floa;

        String a= Integer.toBinaryString(no);

        String sub=a.substring(1, a.length());

        if(floa<0)

        {

           sign=1;

        }

        else

        {

            sign=0;

        }

        int exp=a.length()-1;

        System.out.println(exp);

        int be=127+exp;

        String b= Integer.toBinaryString(be);

        System.out.print("biased exponent->");

        System.out.println(b);

        int loop=23-exp;

        float floatpart =floa-no;

        int q[]=new int[25];

        for(int i=1,j=0;i<=loop;i++,j++)

        {

            q[j]=(int) (floatpart*2);

            floatpart=floatpart*2;

            if(q[j]==1){

               floatpart=floatpart-1;

            }

        }

        System.out.print("mantissa->");

        System.out.print(sub);

        for(int k=0;k<q.length;k++)

        System.out.print(q[k]);

            System.out.println();

                        System.out.println("IEEE754 FORMAT IS");

                        System.out.print(sign+" "+b+" ");

                        System.out.print(sub);

        for(int k=0;k<q.length;k++)

        System.out.print(q[k]);

    }

}