Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Nachkommastellen im Binärsystem (Zeichenketten)

  1. Was bedeuten die Binärzahlen 1.1; 0.101; 0.111...; 0.010101...?
  2. Wie schreiben wir die folgenden Zahlen im Binärsystem: 9.5; 2.75; 0.2; 0.3333...?
  3. Implementieren Sie Teilaufgabe a).
  4. 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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: k.A.
Webcode: ozvv-txgt
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Zu Aufgabenblatt hinzufügen