Kay: Dezimal zu Dual

Hallo,

um Dezimalzahlen in Dualzahlen umzuwandeln, verwende ich momentan folgenden Algorithmus:

Dezimal = 54
Dual = ""
WIEDERHOLE SOLANGE Dezimal > 0
  Dual = (Dezimal Mod 2) + Dual
  Dezimal = Dezimal / 2
ENDEWIEDERHOLE

wie wandle ich aber nun Nachkommastellen einer Dezimalzahl z.B. 54,3 in eine Dualzahl um?

Vielen Dank,
Kay

  1. Vielleicht einfach am Anfang die Zahl beim Komma teilen?

  2. Hallo Kay,

    var Dualzahl=Dezimalzahl.toString(2) tut's auch.

    Gruß Gernot

    1. var Dualzahl=Dezimalzahl.toString(2) tut's auch.

      Gernot,
      War irgendwo die Rede von JavaScript?
      Gunnar

      --
      „Solang wir noch tanzen können
      und richtig echte Tränen flennen,
      ist noch alles offen,
      ist noch alles drin.“
      (Gundermann)
    2. da müsste man ja Java verwenden...
      trotzdem vielen Dank.
      Kay

  3. wie wandle ich aber nun Nachkommastellen einer Dezimalzahl z.B. 54,3 in eine Dualzahl um?

    Als ich google nach dualzahl befragte gab er mir auf der ersten Seite diese Fundstelle:

    http://spotlight.de/zforen/std/m/std-1106687101-30213.html

  4. Hallo,

    um Dezimalzahlen in Dualzahlen umzuwandeln, verwende ich momentan folgenden Algorithmus:

    Dezimal = 54
    Dual = ""
    WIEDERHOLE SOLANGE Dezimal > 0
      Dual = (Dezimal Mod 2) + Dual
      Dezimal = Dezimal / 2
    ENDEWIEDERHOLE

    wie wandle ich aber nun Nachkommastellen einer Dezimalzahl z.B. 54,3 in eine Dualzahl um?

    Rest = 0,3
    Dual2 = ""
    WIEDERHOLE SOLANGE Rest > 0
    Rest = Rest * 10 / 5
    Int1 = INTERGERTEIL(Rest)
    Dual2 = Dual2 + STRING(Int1)
    Rest = Rest - Int1
    ENDEWIEDERHOLE

    Damit das nicht unendlich lange geht sollte man noch eine Abbruchbedingung definieren.

    cu,
    ziegenmelker

    1. Alles klar - hab's hinbekommen, vielen Dank.
      Kay

  5. Hallo,

    wie wandle ich aber nun Nachkommastellen einer Dezimalzahl z.B. 54,3 in eine Dualzahl um?

    Einfacheres Beispiel:
    9.3
    1. Zerlegen in Ganzzahl und echten Bruch
    = 9 + 0.3

    2. Ganzzahl:
    9 : 2 = 4 Rest 1
    4 : 2 = 2 Rest 0
    2 : 2 = 1 Rest 0
    1 : 2 = 0 Rest 1

    3. Bruch:
    0.3 * 2 = 0.6 Ganzzahlanteil 0
    0.6 * 2 = 1.2 Ganzzahlanteil 1
    0.2 * 2 = 0.4 Ganzzahlanteil 0
    0.4 * 2 = 0.8 Ganzzahlanteil 0
    0.8 * 2 = 1.6 Ganzzahlanteil 1
    0.6 * 2 = 1.2 Ganzzahlanteil 1
    ab hier wirds periodisch

    4. Zusammenfassen
    9.3(10) = 1001.010011001100110011(2)

    http://www.netzmafia.de/skripten/ad/ad6.html

    Aber welche praktische Bedeutung hat das? In der Praxis werden Fließkommazahlen (floating point) benutzt.

    viele Grüße

    Axel

    1. Hallo Axel,

      Aber welche praktische Bedeutung hat das? In der Praxis werden Fließkommazahlen (floating point) benutzt.

      Ja, aber genau so werden Fließkommanzahlen intern codiert, als

      f = m * 2^e

      wobei nach irgendeiner IEEE-Norm immer 0.5<=m<1 und e ganzzahlig ist. Damit wird also die Mantisse m genau so gebildet, wie du es beschrieben hast.

      So long,

      Martin

    2. Alles klar, super - vielen Dank.
      Kay

    3. Hallo,

      ich hab' völlig vergessen zu fragen, wie man die Nachkommastellen einer Dualzahl wieder in eine Dezimalzahl umwandeln kann?
      Beispiel: 100,1

      Vielen Dank,
      Kay

      1. Hallo,

        ich hab' völlig vergessen zu fragen, wie man die Nachkommastellen einer Dualzahl wieder in eine Dezimalzahl umwandeln kann?
        Beispiel: 100,1

        100.1(2) = 1*2^2 + 0*2^1 + 0*2^0 + 1*2^-1
                   4     + 0     + 0     + 0.5
                 = 4.5(10)

        Und hier ist das Problem. Die Rückrechnung von z.B. 0.3 geht nur gerundet.
                      ____
        0.3(10)  = 0.01001(2)
                 = 0*2^1 + 0*2^-1 + 1*2^-2 + 0*2^-3 + 0*2^-4 + 1*2^-5  + 1*2^-6
                 =                  0.25                     + 0.03125 + 0,015625
                 = 0,296875

        viele Grüße

        Axel

        1. Axel,

          Und hier ist das Problem. Die Rückrechnung von z.B. 0.3 geht nur gerundet.

          Nö. Wenn du wirklich alle Perioden mitrechnest (Reihenentwicklung), kommt auch genau 0,3 raus. Nur dass Rechner schon nach endlich vielen Schluss machen, verfälscht das Ergebnis.

          0.3(10)  = 0.01001(2)
                   = 0*2^1 + 0*2^-1 + 1*2^-2 + 0*2^-3 + 0*2^-4 + 1*2^-5  + 1*2^-6
                   =                  0.25                     + 0.03125 + 0,015625
                   = 0,296875

          Aber zwei, drei Perioden mehr dürften’s doch sein, dann wird’s auch genauer.

          Gunnar

          --
          „Solang wir noch tanzen können
          und richtig echte Tränen flennen,
          ist noch alles offen,
          ist noch alles drin.“
          (Gundermann)