IEEE 754

IEEE-754, to (za wikipedią) standard reprezentacji binarnej liczb zmiennoprzecinkowych. Jeszcze niecałe 2 miesiące temu żyłem w błogiej nieświadomości i nie miałem pojęcia o jego istnieniu. ;) Jednak na forum 4programmers.net pojawił się wątek, dzięki któremu temat sobie przybliżyłem.

 

Dyskusja dotyczyła pomocy w stworzeniu programu, który wprowadzane liczby zmiennoprzecinkowe przedstawiałby w takiej postaci, w jakiej przechowuje je komputer w pamięci - zgodnie ze wspomnianym wyżej standardem. O ile zadanie programowania zbyt sensownie nie uczy, to tematyka mnie zainteresowała i ciekawy nowej wiedzy z problemem się zmierzyłem. A skoro już uruchomiłem tego bloga, pomyślałem, że równie dobrze mogę go umieścić tutaj ;)

 

Zbyt piękny to on nie jest, ale chyba robi swoje:

 

import java.util.Scanner;


public class Convert
        {
        
        public static void main(String[] args)
                {
                //przygotowanie zmiennych
                Scanner oScanner = new Scanner(System.in);
                String sInput = null;
                Double fLiczba = null;
                //odczytanie liczby
                while (fLiczba == null)
                        {
                        System.out.print("Wprowadz liczbe do konwersji: ");
                        sInput = oScanner.next();
                        try
                                {
                                fLiczba = Double.parseDouble(sInput);
                                }
                        catch (NumberFormatException e)
                                {
                                fLiczba = null;
                                }
                        
                        System.out.println();
                        }
                //konwersja - przygotowanie danych
                boolean bLiczbaUjemna = false;
                if (fLiczba < 0)
                        {
                        bLiczbaUjemna = true;
                        fLiczba = -fLiczba;
                        }
                int iCzescCalkowita = (int)Math.floor(fLiczba);
                double fUlamek = fLiczba - (double)iCzescCalkowita;
                String sCzescCalkowitaBin = "";
                String sUlamekBin = "";
                //konwersja czesci calkowitej na binarna
                while (iCzescCalkowita > 0)
                        {
                        sCzescCalkowitaBin = "" + (iCzescCalkowita % 2) + sCzescCalkowitaBin;
                        iCzescCalkowita = iCzescCalkowita / 2;
                        }
                //konwersja czesci ulamkowej na binarna
                int iCount = 0;
                while (fUlamek > 0)
                        {
                        ++iCount;
                        if (fUlamek >= Math.pow(2, -iCount))
                                {
                                fUlamek = fUlamek - Math.pow(2, -iCount);
                                sUlamekBin = sUlamekBin + "1";
                                }
                        else
                                sUlamekBin = sUlamekBin + "0";
                        }
                System.out.print("Liczba w postaci binarnej: ");
                if (bLiczbaUjemna == true)
                        System.out.print("-");
                System.out.println(sCzescCalkowitaBin + "." + sUlamekBin);
                //utworzenie wykladnika
                String sWykladnikBin = "";
                int iWykladnik;
                if (fLiczba >= 1)
                        iWykladnik = 127 +  sCzescCalkowitaBin.length() - 1;
                else
                        iWykladnik = 127 - sUlamekBin.indexOf("1") - 1;
                while (sWykladnikBin.length() < 8)
                        {
                        sWykladnikBin = "" + (iWykladnik % 2) + sWykladnikBin;
                        iWykladnik = iWykladnik / 2;
                        }
                //utworzenie mantysy
                String sMantysaBin;
                if (fLiczba >= 1)
                        sMantysaBin = sCzescCalkowitaBin + sUlamekBin;
                else
                        sMantysaBin = sUlamekBin.substring(sUlamekBin.indexOf("1"));
                sMantysaBin = sMantysaBin.substring(1);
                while (sMantysaBin.length() < 23)
                        sMantysaBin = sMantysaBin + "0";
                if (sMantysaBin.length() > 23)
                        sMantysaBin = sMantysaBin.substring(0, 23);
                
                System.out.print("Liczba w postaci IEEE-754: ");
                if (bLiczbaUjemna == true)
                        System.out.print("1 ");
                else
                        System.out.print("0 ");
                System.out.print(sWykladnikBin + " ");
                System.out.println(sMantysaBin);
                }
        }

 

I przykładowy wynik korzystania z programu:

 

vgt@server:~/java$ javac Convert.java
vgt@server:~/java$ java Convert
Wprowadz liczbe do konwersji: 21

Liczba w postaci binarnej: 10101.
Liczba w postaci IEEE-754: 0 10000011 01010000000000000000000
vgt@server:~/java$ java Convert
Wprowadz liczbe do konwersji: 8.1

Liczba w postaci binarnej: 1000.0001100110011001100110011001100110011001100110011
Liczba w postaci IEEE-754: 0 10000010 00000011001100110011001
vgt@server:~/java$ java Convert
Wprowadz liczbe do konwersji: -1.2

Liczba w postaci binarnej: -1.0011001100110011001100110011001100110011001100110011
Liczba w postaci IEEE-754: 1 01111111 00110011001100110011001

dodany: 2010-01-05 17:35
Komentarze

Brak komentarzy

Dodaj komentarz
Nick:
Treść: