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

Informatiker Board » Themengebiete » Informatik in der Schule » Bitweise Operatoren, Gleitkommazahlen?(JAVA)? » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 4 Beiträge
eulerscheZahl

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.
WeisserBitcode Daumen hoch! Antwort

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
eulerscheZahl

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).
WeisserBitcode Bitweise Operatoren, Gleitkommazahlen?(JAVA)?

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. */