Bergervei/Java-Dualzahlen
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Java</language>
== Umwandlung einer dezimalen Gleitkommazahl in eine Dualzahl ==
Die nachfolgende Abbildung demonstriert die Algorithmen für die Umwandlung des ganzzahligen bzw. gebrochenen Anteils der Dezimalzahl in den jeweiligen Anteil der Dualzahl:
<blockquote>[[Bild: DezimalToDual1.gif]]</blockquote>
Dualzahlen mit Nachkommastellen sowie ihre ganzzahligen und gebrochenen Anteile werden als Zeichenketten (''Strings'') repräsentiert.
<code id="4d34bbf7aee20">
private double Frac(double x) {
return x-(int)x;
}
private String GanzToDual(double Zahl) {
String DualString = new String();
String TeilString = new String();
int Rest;
int GanzZahl = (int)Zahl;
while (GanzZahl > 0) {
Rest = GanzZahl%2;
GanzZahl = GanzZahl/2;
DualString = TeilString.valueOf(Rest)+DualString;
}
if (DualString.length() == 0) DualString = "0";
return DualString;
}
private String GebrToDual(double Zahl) {
String DualString = new String();
String TeilString = new String();
int Zaehler = 0;
double GebrZahl = Frac(Zahl);
while (GebrZahl > 0 && Zaehler < 32) {
GebrZahl = GebrZahl*2;
DualString = DualString+TeilString.valueOf((int)GebrZahl);
GebrZahl = Frac(GebrZahl);
Zaehler++;
}
return DualString;
}
public String DezimalToDual(double Zahl) {
if (Frac(Zahl) == 0)
return GanzToDual(Zahl);
else
return GanzToDual(Zahl)+"."+GebrToDual(Zahl);
}
</code>
<run id="4d34bbf7af06f">
System.out.println(DezimalToDual(12.625));
</run>
== Umwandlung einer Dualzahl in eine dezimale Gleitkommazahl ==
In ähnlicher Weise können auch Dualzahlen mit Nachkommastellen, die ebenfalls als Zeichenketten vorliegen, in Dezimalzahlen konvertiert werden. Das nachfolgende Schema verdeutlicht wieder die entsprechenden Algorithmen:
<blockquote>[[Bild: DualToDezimal1.gif]]</blockquote>
<code id="4d34bbf7aeeb4">
import java.util.regex.*;
private boolean Korrekt(String DualString) {
Pattern P1 = Pattern.compile("[01]+");
Pattern P2 = Pattern.compile("[01]+[.][01]+");
Matcher M1 = P1.matcher(DualString);
Matcher M2 = P2.matcher(DualString);
return (M1.matches() || M2.matches());
}
private String GanzZerlegen(String DualString) {
String TeilString = new String();
if (Korrekt(DualString)) {
TeilString = DualString;
int Pos = DualString.indexOf(".");
if (Pos > 0) TeilString = DualString.substring(0, Pos);
}
return TeilString;
}
private String GebrZerlegen(String DualString) {
String TeilString = new String();
if (Korrekt(DualString)) {
int Pos = DualString.indexOf(".");
if (Pos > 0) TeilString = DualString.substring(Pos+1, DualString.length());
}
return TeilString;
}
public double DualToDezimal(String DualString) {
String GanzDual = new String(GanzZerlegen(DualString));
String GebrDual = new String(GebrZerlegen(DualString));
double Summe1 = 0; int Laenge1 = GanzDual.length();
double Summe2 = 0; int Laenge2 = GebrDual.length();
double Potenz = 1;
for (int i = Laenge1; i > 0; i--) {
Summe1 = Summe1+Potenz*Integer.parseInt(GanzDual.substring(i-1, i));
Potenz = Potenz*2;
}
double Potenz = 1;
for (int i = 0; i < Laenge2; i++) {
Potenz = Potenz/2;
Summe2 = Summe2+Potenz*Integer.parseInt(GebrDual.substring(i, i+1));
}
return Summe1+Summe2;
}
</code>
<run id="4d34bbf7af0d5">
System.out.println(DualToDezimal("1100.101"));
</run>