簡體   English   中英

將十進制轉換為 IEEE 二進制

[英]Convert decimal to IEEE Binary

我正在嘗試將數字從十進制值轉換為其 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. 檢查String numero的 charAt(0) 是否等於 1
  2. 如果是 (numero.charAt(0) == 1) 則刪除第一個字符
  3. 使用新號碼(不帶 1)調用 GetFloat32()
  4. 返回在 num 前面加上 - 的結果

這可以工作,但我想知道上述方法中的問題出在哪里。 如果可能的話,我寧願避免這種解決方案。

問題是 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));

公共類 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;
    }

    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]);

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM