我正在尝试将数字从十进制值转换为其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")
我收到以下错误:
这意味着我的代码可以完美地处理正数(包括零),但如果是负数,代码就会崩溃。问题出在哪里?
笔记
我想我可以用这种方式解决我的问题
字符串数字
是否有一个字符At(0)等于1这可能有效,但我想知道上述方法中的问题在哪里。如果可能的话,我宁愿避免这种解决方案。
问题是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]);
}
}