Nachkommastellen im Binärsystem (Zeichenketten)
- Was bedeuten die Binärzahlen 1.1; 0.101; 0.111...; 0.010101...?
- Wie schreiben wir die folgenden Zahlen im Binärsystem: 9.5; 2.75; 0.2; 0.3333...?
- Implementieren Sie Teilaufgabe a).
- Implementieren Sie Teilaufgabe b).
0 Kommentare
Bitte melde dich an um einen Kommentar abzugeben
3 Lösung(en)
def bindez(s):
z = s.split('.')
dez = int(z[0])
# faktor muss vom Typ float sein !
faktor = 1.0
for i in range(len(z[1])):
faktor = faktor /2
dez = dez + faktor * int(z[1][i])
return dez
def dezbin(s):
z = s.split('.')
z1 = str(bin(int(z[0])))
z2 = z1.lstrip('-0b')
z2 = z2 + '.'
rest = float('0.'+z[1])
delta = 1.0e-9
faktor = 0.5
while (rest > delta):
if rest >= faktor:
z2 = z2 + '1'
rest = rest - faktor
else:
z2 = z2 + '0'
faktor = faktor / 2
return z2
print 'BIN --> DEZ'
print '1.1'
print bindez('1.1')
print '0.101'
print bindez('0.101')
print '0.11'
print bindez('0.11')
print '0.010101'
print bindez('0.010101')
print ''
print 'DEZ --> BIN'
print '9.5'
print dezbin('9.5')
print '2.75'
print dezbin('2.75')
print '0.2'
print dezbin('0.2')
print '0.333333333'
print dezbin('0.333333333')
print '0.1'
print dezbin('0.1')
import java.util.Scanner;
/**
* Berechne binäre Nachkommastellen und
* zurück.
* @author Philipp Gressly (phi AT gressly DOT ch)
* Nov. 2010
*/
public class NachkommastellenImBinaerSystem {
public static void main(String[] args) {
new NachkommastellenImBinaerSystem().top();
}
void top() {
if(eingabeBool("Bin2Dez (b), Dez2Bin(d)", "b", "d")){
bin2dez();
} else {
dez2bin();
}
}
void dez2bin() {
double dez = einlesenDouble("positive Dezimalzahl");
String resultat = "";
int ganzzahlteil = (int) dez;
double nachkommateil = dez - ganzzahlteil;
resultat = vorkommastellenDez(ganzzahlteil);
resultat = resultat + "." +
nachkommastellenDez(nachkommateil);
System.out.println(dez + "(10) = " + resultat + "(2)");
}
String nachkommastellenDez(double nachkommateil) {
int pos = 1; // Binäre Nachkommastelle 1..55 = Max-Mantisse
String res = "";
while(pos <= 18) {
nachkommateil = nachkommateil * 2;
if(nachkommateil >= 1) {
res = res + "1";
} else {
res = res + "0";
}
nachkommateil = nachkommateil - (int) nachkommateil;
pos = pos + 1;
}
return res;
}
/**
* Erzeuge aus einer ganzen Zahl die binäre
* Darstellung als String.
* @param ganzzahlteil
* @return Binäre Darstellung.
*/
String vorkommastellenDez(int ganzzahlteil) {
String bin = "";
while(ganzzahlteil > 0) {
if(ungerade(ganzzahlteil)) {
bin = "1" + bin;
} else {
bin = "0" + bin;
}
ganzzahlteil = ganzzahlteil / 2;
}
if("".equals(bin)) {
return "0";
}
return bin;
}
boolean ungerade(int ganzzahlteil) {
return 1 == ganzzahlteil % 2;
}
void bin2dez() {
String bin = einlesen("Binaer (z. b. 10.011)");
double resultat = 0;
String vorkomma = vorkommastellenBin(bin);
String nachkomma = nachkommastellenBin(bin);
resultat = bin2dezInt(vorkomma);
resultat = resultat + bin2dezFrac(nachkomma);
System.out.println(bin + "(2) = " + resultat + "(10)");
}
int bin2dezInt(String vorkomma) {
/* Dies ist nicht wirklich gelöst,
* doch die Aufgabe zielt nicht auf die
* Vorkommastellen.
*/
return Integer.parseInt(vorkomma, 2);
}
double bin2dezFrac(String nachkommastellen) {
double value = 1.0 / 2;
double resultat = 0.0;
for(char binZiffer : nachkommastellen.toCharArray()) {
if('1' == binZiffer) {
resultat = resultat + value;
}
value = value / 2;
}
return resultat;
}
String vorkommastellenBin(String bin) {
int pktPos = bin.indexOf('.');
if(pktPos >= 0) {
return bin.substring(0, pktPos);
}
return bin;
}
String nachkommastellenBin(String bin) {
int pktPos = bin.indexOf('.');
if(pktPos >= 0) {
return bin.substring(pktPos+1);
}
return "";
}
/**
* Frage mit "trueString" oder "falseString"
* beantworten lassen.
* @return true, genau dann, wenn der User "trueString" eingibt.
*/
Scanner sc = new Scanner(System.in);
boolean eingabeBool(String frage,
String trueString,
String falseString)
{
System.out.println("Eingabe\n" + frage);
String eingabe = sc.next();
return trueString.equals(eingabe);
}
String einlesen(String frage) {
System.out.println("Eingabe\n" + frage + ":");
return sc.next();
}
double einlesenDouble(String frage) {
return Double.parseDouble(einlesen(frage));
}
} // end of class NachkommastellenImBinaerSystem
function floatBinToDec(str) {
str = str.split('.');
let before = parseInt(str[0], 2);
after = str[1],
divisor = 2, res = 0;
for (let i = 0; i < after.length; i++) {
res += parseInt(after[i]) / divisor;
divisor *= 2;
}
return before + res;
}
function floatDecToBin(num) {
function truncate(n) {
// krank. aber das einzige, dass mit kommazahlen
// in javascript wirklich funktioniert
return parseFloat('.' + n.toString().split('.')[1])
}
const MAX_LENGTH = 50;
let before = Math.floor(num).toString(2) + '.',
list = [], protocol = [],
period = false;
while ((num != 1) && (!period) && (list.length <= MAX_LENGTH)) {
num = truncate(num);
num *= 2;
list.push((num >= 1) ? '1' : '0');
if (protocol.indexOf(num) == -1) protocol.push(num);
else {
period = true;
list.push('...');
}
}
return before.concat(list.join(''));;
}
// ausgabe
console.log( floatBinToDec('1.1') );
console.log( floatBinToDec('1.11') );
console.log( floatBinToDec('1.1111111111111111') );
console.log( floatBinToDec('1.01') );
console.log( floatBinToDec('1.0101010101010101') );
console.log( floatDecToBin(9.5) );
console.log( floatDecToBin(2.75) );
console.log( floatDecToBin(0.2) );
console.log( floatDecToBin(0.3) );
console.log( floatDecToBin(0.3333333) );
console.log( floatDecToBin(1/3) ); // lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 2 |
Schwierigkeit: | k.A. |
Webcode: | ozvv-txgt |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |