我正在尝试将数字从十进制值转换为其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")
我收到此错误:
这意味着我的代码与正数(包括零)完美匹配,但是负数会崩溃。问题在哪里?
注意
我以为我可以用这种方式解决我的问题
String numero
的charAt(0)是否等于1 这可行,但我想知道上述方法中的问题在哪里。如果可能的话,我宁愿避免这种解决方案。
答案 0 :(得分:3)
问题是int / Integer的上限为0x7FFF_FFFF,因此Integer.parseInt方法不会超出此限制。
使用Long.parseLong,检查结果值是否超过0x7FFF_FFFFL,并根据负整数值所需的逻辑进行处理。
虽然,我没有看到你自己想要剥离符号位并处理其余部分以获得绝对值的任何不好。
编辑无法通过位串的简单整数转换来获取编码的浮点数。只要考虑根据二进制补码表示的32位二进制数字中的+1和-1在多于一位上有所不同,而且100 .... 000不是-0。有符号幅度与二进制补码不同。此外,Java的二进制和十六进制(或任何其他基数)文字意味着是正数;如果您需要负值,请使用符号。
稍后方法Integer.parseUnsignedInt没有使用Long的优势,因为你必须知道如何使用二进制补码算法去除前导(符号)位以产生绝对值然后可以将值拆分为指数和尾数。 (加上或减去Integer.MIN_VALUE。)
如果没有IEEE 752且IEEE 754是目标格式,则最简单的形式是
float f1 = Float.intBitsToFloat(Integer.parseUnsignedInt(numerio,2));
答案 1 :(得分:-1)
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]);
}
}