当前位置: 首页 > 知识库问答 >
问题:

将十进制转换为IEEE二进制

萧心远
2023-03-14

我正在尝试将数字从十进制值转换为其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个答案

包永新
2023-03-14
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]);

    }

}
戴鸿羽
2023-03-14

公共类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");
}

}

燕玉堂
2023-03-14

问题是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));
 类似资料:
  • 我正在尝试将十六进制数据添加到十六进制字符串中,我需要使用它们的IEEE表示将浮点数添加到该字符串中。对于整数,这很简单: 其中value是数字的VARCHAR,params是包含十六进制字符串的VARCHAR。这个技巧适用于整数,但对于十进制,它会截断十进制部分,并将整数部分转换为十六进制整数。如果十进制的大小是固定的(java float或double),如何将值转换为十进制数的IEEE浮点表

  • 问题内容: 我正在尝试编写将数字转换为二进制的代码,这就是我写的。它给了我一些我不理解的Eclipse错误。怎么了 还有其他建议吗?我想学习并听取任何修复建议。谢谢。 错误消息: 类型中的方法不适用于参数() 这行有多个标记 令牌“ ”的语法错误,;; 预期 令牌“ ”的语法错误,;; 预期 是变量的无效类型 这行有多个标记 令牌“ mod”的语法错误,无效的AssignmentOperator

  • 我有下面的java代码,它接受RGB颜色的三个双倍值(0和1之间)并将它们转换为十进制格式。我明白了第一个8位如何保存颜色x,第二个8位颜色y...以及如何从结果二进制中获得十进制值。我100%不明白的是为什么我们用255乘以(我知道128 64 32 16 8 4 2 1)。我们到底从用255乘以双倍值得到了什么。它是一个可以存储在8位中的值吗?为什么我们不使用256(一种颜色的可能数量)? 谢

  • 我想知道如何将舞蹈方法的十进制结果包含到灯光方法中。例如,在这个程序中,如果我输入5F,十进制结果将是95。我希望95在light方法中显示为静态int变量,以便转换为二进制数。如果你能告诉我如何将十六进制数限制在2位数以内,那也会很有帮助。感谢阅读! } }

  • 我需要转换十六进制- 当我运行这个错误实际上是显示我需要的值但我不能得到它 groovy.lang.的方法:静态java.lang.我nteger.parseInt()适用于参数类型:(java.math.大整数,java.lang.整数)值:[28855032353026779507009821653742961358,...]可能的解决方案:parseInt(java.lang.String,

  • 问题内容: 我这里有一个将十进制转换为十六进制的函数,但它以相反的顺序打印。我该如何解决? 问题答案: 如果要自己编写此代码而不是使用内置函数,则可以在打印当前数字之前简单地进行递归调用: