Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Informatik in der Schule » Bitweise Operatoren, Gleitkommazahlen?(JAVA)? » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Bitweise Operatoren, Gleitkommazahlen?(JAVA)?
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
WeisserBitcode
Jungspund


Dabei seit: 13.09.2017
Beiträge: 16

Bitweise Operatoren, Gleitkommazahlen?(JAVA)? Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Gegeben: Eine Gleitkommazahl a mit Datentyp float. Gesucht: Den zweifachen Wert von a ohne ihn durch Gleitkommaoperationen auszurechnen. Es soll nur der Exponent in der Codierung der Gleitkommazahl ge¨andert werden. Mantisse und Vorzeichen bleiben gleich. 1. Die Gleitkommazahl mit der Funktion Float.floatToIntBits(float) in die bin¨are Codierung umwandeln und in eine int Variable speichern. 2. Mit den bitweise Operatoren den Exponenten aus der Codierung holen, in eine ganze Zahl umwandeln, 1 addieren, den Exponenten wieder zuruck an die richtige Stelle in der Gleitkom- ¨ mazahl einfugen. Sie sollten dies zum Testen schrittweise programmieren und die ¨ Ergebnisse der Zwischenschritte zur Uberpr ¨ ufung am Bildschirm ausgeben. ¨ 3. und mit Float.intBitsToFloat(int) wieder in Gleitkommazahl umwandeln. 4. Das Ergebnis auf dem Bildschirm ausgeben. Wenn Sie Ihr Programm erfolgreich getestet haben, dann versuchen Sie die Anzahl verwendeter Variablen zu reduzieren.

Meine Ideen:
package info1;
public class BitweiseOperatorenGleitkommazahlen {


public static void main(String[] args) {
float b = 10f;
float c = 3f;
float a = b / c;
int d = Float.floatToIntBits(a);
System.out.println(d);
}
}

/*Hänge bei ...

Mit den bitweise Operatoren den Exponenten aus der Codierung holen.

Komm hier nicht weiter, ich bekomme zwar einen 10 stelligen Wert heraus, aber keine Ahnung wie ich mit dem arbeiten soll. */
14.01.2018 18:59 WeisserBitcode ist offline Beiträge von WeisserBitcode suchen Nehmen Sie WeisserBitcode in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Die einfache Lösung:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public class Infoboard {

	static float doubleValue(float f) {
		int n = Float.floatToIntBits(f);
		n += 1 << 22;
		return Float.intBitsToFloat(n);
	}

	public static void main(String[] args) {
		float f = 0.3f;
		System.out.println(doubleValue(doubleValue(f)));
	}
}


Mit den gewünschten Zwischenschritten:
code:
1:
2:
3:
4:
5:
6:
7:
8:
static float doubleValue(float f) {
	int n = Float.floatToIntBits(f);
	int exponent = (n >> 22) & 0xff;
	n ^= exponent << 22;
	exponent++;
	n |= exponent << 22;
	return Float.intBitsToFloat(n);
}


Edit:
ich weiß nicht, wie gut das bei Randfällen (etwa extended Format nahe der 0) funktioniert. Für Werte, die bei Verdopplung über den Maximalbereich von float hinausgehen, liefert mein Code NaN (statt Infinity).

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 15.01.2018 10:56.

15.01.2018 10:53 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
WeisserBitcode
Jungspund


Dabei seit: 13.09.2017
Beiträge: 16

Daumen hoch! Antwort Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Und zwar habe ich es mal so umgeschrieben, das es für mich bisschen übersichtlicher ist, also überhaupt mal den Anfang zu kapieren.

package info1;

public class test {

public static void main(String[] args) {
float f = 10f;
int n = Float.floatToIntBits(f);
int exponent = (n >> 22) & 0xff;
n ^= exponent << 22;
exponent++;
n |= exponent << 22;
System.out.println(f);
System.out.println(n);
System.out.println(exponent);
}

}
10.0
1096810496
5

Also als Erstes gebe ich ja meine Zahl an (10). Dann lass ich mir die interne Darstellung angeben (leider kapier ich nicht wie diese Zahlen zusammenkommen). Und dann holen Sie den Exponenten mit (n >> 22) & 0xff heraus.

Ich verstehe es so...
Ihr n beträgt 1096810496, dann wird diese zahl in die Binärschreibweise umgewandelt und mit dem right Operator um 22 Stellen versetzt. Wie kommen Sie auf die 22? So bekommen wir den wert 261 heraus. Also haben wir gerade 261 & 0xff hier stehen. Was dieses 0xff heißt weis ich leider auch nicht. Ich weis gerade nur das die 261 & 0xff später eine 5 herausgeben.

Ich würde mich sehr freuen wenn Sie mir dies kurz erklären könnten. Leider finde ich auch nichts Internet.

Gruß WB
15.01.2018 12:50 WeisserBitcode ist offline Beiträge von WeisserBitcode suchen Nehmen Sie WeisserBitcode in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Leider habe ich einen Fehler gemacht, es ist 23 statt 22.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
public class Infoboard {
	static void PrintBinary(int n, int pad, String meaning) {
		System.out.println();
		if (meaning != "")
			System.out.print(meaning + ": ");
		String bits = Integer.toBinaryString(n);
		while (bits.length() < pad)
			bits = "0" + bits;
		System.out.println(bits);
	}

	static float doubleValue(float f) {
		int n = Float.floatToIntBits(f);
		PrintBinary(n, 32, "");
		System.out.println("VEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM");
		//Vorzeichen, Exponent (8 Bits), Mantisse (23 Bits)

		int exponent = (n >> 23) & 0xff;
		PrintBinary(exponent, 8, "Exponent");

		//Exponent auf 0 setzen
		n ^= exponent << 23;
		PrintBinary(n, 32, "");
		System.out.println("VEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM");

		exponent++;
		n |= exponent << 23;
		PrintBinary(n, 32, "");
		System.out.println("VEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM");

		return Float.intBitsToFloat(n);
	}

	public static void main(String[] args) {
		float f = 10;
		System.out.println(f + " --> " + doubleValue(f));
	}
}


Das hängt damit zusammen, wie die floats kodiert sind (IEEE754). Vorzeichen, dann 8 Bit für den Exponenten, 23 für die Mantisse.
Ich habe dir ein paar Kontrollausgaben eingebaut.
Das & 0xff ist ein bitweises Und. 0x heißt, es ist eine Hexzahl (Binär also 8 1er). So kann ich alle Bits außer den 8 niederwertigsten auf 0 setzen (und ein negatives Vorzeichen entfernen, das davor stünde).


Du kannst mich ruhig mit "Du" anschreiben, mache ich auch nicht anders.

__________________
Syntax Highlighting fürs Board (Link)
15.01.2018 16:42 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Informatik in der Schule » Bitweise Operatoren, Gleitkommazahlen?(JAVA)?