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
Brak komentarzy