Zamiana liczb rzeczywistych na zmiennoprzecinkowe

0

Hi,

od kilku dni walcze z java,jestem nowa w tym temacie a u mnie na uniwerku zamiast wyjasniac to walcza z czasem i przez to nawet nie wiem jak to ugryzc.
Moj problem:
mam napisac program, ktory zamienia liczbe rzeczywista na liczbe zmiennoprzecinkowa IEEE754 (bez szczegolnych przypadkow jako tzw ulatwienie)
Pomozcie prosze [!!!]
8-O

0

zamienia liczbe rzeczywista na liczbe zmiennoprzecinkowa
wtffloat f = (float) 0.1;?

0

Hi,
dziekuje bardzo za odpowiedz, tyle tylko ze nie moge tego w programie uzyc, mam stworzyc program, ktory zamieni liczbe rzeczywista na IEEE754, czyli mam zamienic liczbe przed przecinkiem na binarna, po przecinku na binarna, przedstawic eksponet i mantyse.Uzyc mam metode toSingle, gdzie mam parametr typu double i zwraca mi jako Array.Jako wynik mam miec na konsoli binarne przedstawienie. Klasy Float i Double z Java-Biblioteki nie wolno mi uzyc. Niestety dla mnie nie jest to takie proste i oczywiste

0

masz podaną liczbę rzeczywistą. Liczba w IEEE754 w tym przypadku to nic innego jak dwie tablice bajtów zamknięte w ramach jakiejś klasy.


public class LiczbaIEEE{
   
     private byte[8] wykladnik;
     private byte[16] mantysa;
     private byte znak;

     public LiczbaIEEE(byte znak, byte[] wykladnik, byte[] mantysa){
           /// tu przypisujesz do pól.
     }
  
}

Co do konwertowania z zapisu w systemie dziesiętnym to poszukaj w googlu jest trochę przykładów.

0

Ja wygoglałem http://www.eioba.pl/a2231/standard_ieee_754
Jest tam napisane o co chodzi, są przykłady jak liczyć i jest też kod programu, ale w innym języku. Dodatkowo można wnioskować, że artykuł poziomem trudności odpowiada zakresowi wiedzy w liceum, więc student uniwersytetu nie powinien mieć problemów. A tak w ogóle, to w czym jest problem? Może nie w samym algorytmie, tylko w języku Java? Napisz co już zrobiłeś, jaki jest problem, co chcesz zrobić dalej, ale nie wiesz jak no i w ogóle konkrety, a nie że nie umiesz tego zaprogramować.

0

super, dziekuje ci bardzo za odpowiedz i podpowiedz.niestety jestem w tym bardzo zielona i wiem, ze moje pytania moga stresowac.Wpisalam mantyse, znak i eksopnent jak wyzej ale pokazuje mi w programie ze brakuje tej metody.jak nazywa sie ta metoda i jak mam ja wprowadzic? i sorry nie chialam nikogo "zdenerwowac" moimi pytaniami, wiem jak sie zamienia liczby na ieee754 i odwortnie na papierze ale nie wiem jak to jest w prgramie zwlaszcza java i to jest moj pierwszy program,ktory musze stworzyc i dla mnie jako laika jest .... ciezko.dzieki z gory za wyrozumialosc

0

Wklej kod, który masz, bo nie mogę odgadnąć co to jest "ta metoda". Czy mam rozumieć, że to jest w ogóle pierwszy w życiu program komputerowy?

0

niestety tak,jak studiowalam mate to uczylam sie programowac w delpfhi.to bylo krotko i dawno.teraz niestety i stety moim glownym jezykiem programowania jest java o ktorym nie wiem praktycznie jeszcze nic.pokazali nam na uniwerku program"hello world" i dali nam program i ieee do zrobienia. dlatego jak mam :privat byte[8]= eksponent;
privat byte [16] = mantise;
privat byte znak;

public IEEE754(byte znak, byte[] mantise, byte[] eksopnent);
wyskakuje mi :"missing methody body,or declare abstact" i nie umiem ruszyc dalej:(ciezko dla poczatkujacego, ksiazki jakos sa nieprzestepne dla poczatkujacego
potrzebuje bardzo kogos kto mi pomoze stworzyc moj pierwszy program w javie zebym to wkoncu zrozumiala,co jak dlaczego, bo nie rusze dalej ze studiami dlatego prosze o zrozumienie

0

No bo masz średnik na końcu, a tam ma być tak jak napisał Koziołek, czyli w nawiasach ma być przypisanie argumentów konstruktora do pól klasy.
Poza tym, to nie tędy droga, najpierw by wypadało mieć koncepcję, czyli co ma program zrobić po uruchomieniu, kiedy coś obliczać, jak wypisać wynik i co zrobić dalej. Ważne może być pobranie danych: czy mają być czytane z konsoli, z pliku, wpisane na stałe w programie czy może jeszcze inaczej.

0

Sylwio, sięgnij zatem do naszych serwisowych zasobów:
Podstawy Javy
Chyba już prościej się nie da.

0

ok dzieki.Odpowiedz na jeden problem:dane maja byc z konsoli

0

Wczytanie danych widzę tak, że na konsoli pojawia się komunikat "Podaj liczbę", użytkownik wprowadza tą liczbę i następuje przetwarzanie. Jak wczytać tekst z klawiatury to można znaleźć gdziekolwiek. Teraz tekst ze stringa można skonwertować na liczbę float (a jak nie można na float, to na tablicę). Dalej trzeba wyliczyć wartości bitów w reprezentacji bitowej i wypisać na konsolę.

0

wlasnie z tym mam problem, jak wyliczyc wartosci bitow w reprezentacji bitowej

0

Skoro na kartce umiesz, to tak samo w programie trzeba. Najpierw znajdujesz cechę, mantysę i znak. Dalej, jak masz to jako liczby typu int, to można zrobić operacje bitowe i złożyć w jedną liczbę. Albo bez kombinacji wypisać wynik po kawałku: znak, cecha, mantysa. Do wypisywania też sprawdzasz liczby bit po bicie i jak jest 1 to piszesz 1, a jak 0 to 0.

0

chmm..ok to tyle co wiem:

  1. podaj x=a.b
  2. if x = 0 then "0" zakoncz else
  3. znak:
    while x<>0 do{
    if x<0 then array[0]=1// array tablica w ktorej mam binarne przedstawienie liczby dziesietnej,a[0]=0 czyli dla i=0
    else
    array[0]=0
    4.Zamieniam liczbe przed przecinkiem,czyli a na binarna: a mod 2 (a%2)
    5.Zamieniam liczbe b po przecinku na binarna: b[j]=b[j]*2>=1 then "1" else "0"
    6.Musze teraz dodac c[i+j]=a[i]+b[j] i przesunac przecinek do pierwszej 1 z przodu.Jak???!!!
    w ten sposob normalizuje mantyse
    7.eksopnent: liczba przesuniec przecinka +127(Bias)
    8.Wyswietl na konsole: String.out.println(x[i])

tyle wiem,czy faktycznie jestem taka glupia i naiwna?
Mozesz mi prosze pomoc jak to zaczac do pierwszej petli?
rozmawiam przez skypa z cala moja grupa wlasnie i nikt nie umie.dluga nocka dlugi weekend ale najgorsze ze bez efektu
jesli tak to dzieki z gory za wyrozumialosc a jesli nie to tez dzieki.

0

Jezeli kod ma byc ladny i przejrzysty, to bedzie wymagal jeszcze troche pracy, ale jesli ma tylko realizowac zadanie, to chyba dziala, jak powinien (porownywalem rezultaty z online'owym konwerterem w JavaScript i wychodzilo tak samo).

import java.util.Scanner;


public class Test
	{
	
	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);
		}
	}

0

u mnie na uniwerku zamiast wyjasniac to walcza z czasem

Tak z ciekawości zapytam: a jak się nazywa ten przedmiot, na który trzeba napisać ten program? W poście powyżej jest elegancki kod, który rozwiązuje to zadanie. Moim skromnym zdaniem, gdym miał się uczyć pisania kodu w języku Java w ten sposób, to na niewiele by mi się to przydało. Świat poszedł do przodu, wymyślono programowanie obiektowe, komponentowe i inne. No ale do rozwiązania zadania na uniwersytecie wystarczy jedna funkcja main...
I żeby nie było: to nie jest jakaś uwaga do kodu, który napisał VGT, tylko raczej do tego co jest ważne na uniwersytecie.

0

@chodnik

Tez mnie to troche zastanawialo. Obstawiam, ze tutaj argumentem moze byc cos takiego co sam wielokrotnie slyszalem za czasow, gdy studiowalem: wiedza o tym, jak dziala komputer (w tym przyadku: jak przechowuje wprowadzane dane) przyda sie i pozwoli lepiej zrozumiec programowanie. Tylko nie do konca jestem przekonany, czy takie podejscie ma sens. W koncu po to powstaly kolejne poziomy abstrakcji, zeby nie trzeba bylo myslec jak komputer (ja do wczoraj nic nie wiedzialem o IEEE-754 ;) ).
Natomiast rozwiazanie przedstawionego tutaj problemu, to typowy kod strukturalny, ktory napisaloby sie tak samo niemal linijka w linijke w C nascie lat temu. Wprowadzanie tutaj obiektowki byloby mocno na sile.
Tak jak zasugerowales - pytanie tylko, czy taka nauka ma sens. Sa wykladowcy, ktorzy maja odpowiednio nowoczesne podejscie do nauki programowania (sam tez na szczescie mialem jednego i dzieki niemu zaczalem programowac obiektowo), ale pewnie nadal sa w mniejszosci.

0

dla zaspokojenie ciekawosci,przedmiot nazywa sie metody praktycznej informatyki.uniwerek w niemczech.po studiach w polsce musze przyznac,ze troche "dziwny"maja sposob wpojenia studentom programowania.kup ksiazke i googel i ucz sie sam.wyklady mozesz zapomniec bo i tak nie to masz co masz na cwiczeniach zrobic.dlatego tez wiekszasc ma problemy juz na poczatku:(niestety.mam nadzieje jednak ze naucze sie programowania w java.to jest i bedzie moj glowny jezyk programowania,przynajmniej na poczatku.chmmm...dziekuje bardzo za pomoc i wyrozumialosc na poczatek od poczatkujacej.

0

pytanie.mam public class Converter.skad mam ja importowac?albo jak znalezc ta metode?

0

To nie jest klasa z JRE, więc zapewne trzeba ją sobie napisać. To nie jest tak, że po tekście public class Converter juz wszystko jest jasne i ktoś ci odpowie. Ważne jest do czego albo w czym, albo po co chcesz tego użyć. Tak więc więcej szczegółów.

0

do programu,ktory zamienia liczby w systemie dziesietnym na liczbe o dowolnej bazie:
public class Converter {
public static void main ( String [ ] args ) {
if ( args.length < 2) {
System.out.println (”Error : Use Converter <Base> <Number>”) ;
return ;
}

int b = Integer.parseInt(args[ 0 ] ) ;
int x = Integer.parseInt ( args[ 1 ] ) ;

String xb = ”” ;

if ( x == 0) {
System.out.println( ”( 0 )” + b);
return ;
}
while ( x > 0) {
char c = getDigit ( x % b) ;
xb = c + xb ;
x = x / b ;
}
System.out.println( ”( ” + xb + ”) ” + b);
}

public static char getDigit ( int i ) {
if ( i < 10) {
return ( char ) ( ’ 0 ’ + i ) ;
} else {
return(char)(’A’ + i − 10) ;
}
}
}
nie rozumiem dlaczego nie dziala mi ten program

0

Program jest dobry, tylko ma niedozwolone znaki. Powinien być cudzysłów " i apostrof '. Ponadto w apostrofach ma być jeden znak, czyli '0', a nie ’ 0 ’. I jeszcze w tym: ’A’ + i − 10 minus jest jakiś inny niż powinien być. Jak się to zamieni, to się kompiluje i daje poprawny wynik dla zamiany 10 na liczbę dwójkową.

0

dzieki:)!

1 użytkowników online, w tym zalogowanych: 0, gości: 1