Seite 2 von 4

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 14:50
von marl
Ja das ist klar. Bei meiner Anwendung wird die Zahl allerdings nicht von einem Benutzer eingegeben, sondern errechnet. Ich muss also mit einer mathematischen Methode die Periode erkennen.

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 15:58
von gnasen
dafür müsstest du aber alle (in schlimmsten Fall unendlich) viele Nachkommastellen kennen.
Nimm als Beispiel eine transzendente Zahl, zB e, pi, sqr(2) etc.
Diese haben keine periodische Darstellung. Du hast jetzt in einer Float sagen wir mal beispielweise 6 Nachkommastellen. Du kannst jetzt nicht entscheiden, ob dort eine Periode drin liegt.
zB:
1.232323 könnte die Periode (23) haben. Aber vllt ist die 7. Nachkommastelle ja eine 5?
1.234567 tja jetzt kann erst recht nur noch geraten werden ;)

Hier ein Satz der das ganze noch ergänzt (die Richtung Bruch -> Periodische Zahl):
Betrachte a/b vollgekürzt (dh ggt(a,b) = 1) und die Darstellung b = 2^x * 5^y * d mit ggt(d,10) = 1.
Dann gilt:
Ist d = 1, so hat a/b abbrechende Dezimaldarstellung.
Ist d != 1, so hat a/b eine periodischer Dezimaldarstellung.

Umgekehrt bedeutet das: Du hast mit einer Float immer eine abbrechende Dezimaldarstellung. Das bedeutet, dein ermittelter Bruch hat immer eine Zahl im Nenner stehen, die das Produkt 2^x * 5^y ist. Also kannst du periodische Zahlen schlichtweg nicht genau erfassen.

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 16:11
von STARGÅTE
marl hat geschrieben:Ich muss also mit einer mathematischen Methode die Periode erkennen.
>_<

Nun gut, gehen wir mal zurück an den Anfang.
Warum möchtest du eine Dezimalzahl (mit oder ohne Periode) in einen Bruch umwandel?
Fest steht ja, das du mit dem Bruch in PB nichts weiter anfangen kannst.
Was genau ist dein also Ziel?

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 16:54
von marl
Ok, gnasen ich habs befürchtet, daß sich mein Studienabbruch im 4.Semester Maschinenbau (immerhin Höhere Mathematik 4) irgendwann mal rächt. :wink:
Ich muss mal überlegen, ob man das nicht anders lösen kann.

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 17:08
von marl
Stargate,

die ganze Problematik zu schildern würde den Rahmen sicher sprengen. Es geht eigentlich nur darum aus der Dezimalzahl ein Verhältnis (z.B. 4:5) herauszubekommen.
Wenn ich also z.B. 0,55(Periode) habe dann ist das Verhälnis 5/9!
Wenn ich jetzt bspw. die Zahl auf 0,55 runde, dann bekomm ich ja mit der Methode deines Codes auf 11/20!

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 17:26
von Nino
marl hat geschrieben:ich habs befürchtet, daß sich mein Studienabbruch im 4.Semester Maschinenbau (immerhin Höhere Mathematik 4) irgendwann mal rächt. :wink:
Hier rächt sich eher, dass du in der Schule ca. in der Mittelstufe im Mathe-Unterricht nicht aufgepasst hast. :mrgreen:
marl hat geschrieben:Wenn ich also z.B. 0,55(Periode) habe dann ist das Verhälnis 5/9!
Wenn ich jetzt bspw. die Zahl auf 0,55 runde, dann bekomm ich ja mit der Methode deines Codes auf 11/20!
Stargate hatte dir die Antwort schon geschrieben, das kannst du ihm ruhig glauben:
Du kannst es nicht erkennen, wenn es nicht "markiert" ist.
Woran soll denn ein Programm erkennen, ob mit "0,55" genau "55 Hundertstel" gemeint ist, oder ob das eine abkürzende Schreibweise für "Null Komma Periode 5" sein soll?
Antwort: Das kann ein Programm nicht erkennen. "0,55" sind eben "55 Hundertstel", und wenn Du "Null Komma Periode 5" darstellen willst, musst du es irgendwie anders schreiben.

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 17:50
von marl
Hier rächt sich eher, dass du in der Schule ca. in der Mittelstufe im Mathe-Unterricht nicht aufgepasst hast. :mrgreen:
Auch das halte ich durchaus für möglich! :wink:

Woran soll denn ein Programm erkennen, ob mit "0,55" genau "55 Hundertstel" gemeint ist, oder ob das eine abkürzende Schreibweise für "Null Komma Periode 5" sein soll?

Genau das ist doch das Problem. Die Kommazahl wird vom Programm errechnet. Und ich bräuchte eine mathematische Methode, die mir sagt, dass es sich beim Ergebnis um eine Periode handelt.
Ein Taschenrechner kann das auch. Es müsste also gehen. Ich fürchte nur, daß das mein Mathewissen leider nicht hergibt.
Auch meine Google Erfolge sind hinsichtlich dieser Problematik dürftig.

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 18:07
von Nino
marl hat geschrieben:Woran soll denn ein Programm erkennen, ob mit "0,55" genau "55 Hundertstel" gemeint ist, oder ob das eine abkürzende Schreibweise für "Null Komma Periode 5" sein soll?

Genau das ist doch das Problem.
Eben. :D
marl hat geschrieben:Die Kommazahl wird vom Programm errechnet. Und ich bräuchte eine mathematische Methode, die mir sagt, dass es sich beim Ergebnis um eine Periode handelt.
Aber so eine Methode gibt es halt nicht.

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 18:15
von Ramihyn_
marl hat geschrieben:Genau das ist doch das Problem. Die Kommazahl wird vom Programm errechnet. Und ich bräuchte eine mathematische Methode, die mir sagt, dass es sich beim Ergebnis um eine Periode handelt.
Nur so ein spontaner Gedanke aber...

Wenn die Zahl als Ergebnis durch eine Berechnung Deines Programmes zustande kommt, könntest Du doch die gleiche Berechnung zweimal mit unterschiedlichen Genauigkeiten ausführen und dann die Differenz der Genauigkeit betrachten. Es hätte zwar das gleiche Problem wie auch andere hier schon geschildert haben, wäre vielleicht aber ein brauchbarer Indikator, je nachdem was der Anwendungszweck ist :)

Re: Dezimalzahlen in Bruch umwandeln

Verfasst: 15.11.2011 18:47
von STARGÅTE
Ein Taschenrechner kann das auch. Es müsste also gehen.
Kann er nicht!
Ich habe eigentlich keine Lust es noch mal zu sagen, aber du glaubst es ja scheinbar immer noch nicht.

0.333 oder 0.33333333 ist und bleibt immer 0.333 ! Dort eine 0.3 hinein zu interpretieren, wäre einfach nur deineInterpretation der Zahl.

Das der Taschenrechner das kann ist genauso quark.
Dort gibt es zwar eine Taste, die aus Dezimalzahldarstellung die Buchdarstellung macht, aber auch dort wird aus 0.333, 333/1000 und nicht 1/3!

Das einizge was du machen könntest ist: das du bei genügen Stellen einfach am Nenner "rumspielst" (+1, +2, -1, -2) und gucks, wann der Bruch gekürzt wird. Was meiner Meinung aber nicht immer das gewünschte Resultat bringt.

Hier der Code dazu:

Code: Alles auswählen

; Struktur eines Bruchs
Structure Fraction
   Numerator.i
   Denominator.i
EndStructure

; Erstellt einen Bruch aus einer Fließkommazahl.
Procedure DecimalFraction(*Fraction.Fraction, Float.f)
   Protected Factor.i = 1
   While Int(Float)*1.0 <> Float
      Float * 10
      Factor * 10
   Wend
   *Fraction\Numerator = Float
   *Fraction\Denominator = Factor
EndProcedure

; Kürzt einen Bruch so weit wie es möglich ist.
Procedure SimplifyFraction(*Fraction.Fraction)
   Protected Mod.i
   Protected Numerator.i = *Fraction\Numerator
   Protected Denominator.i = *Fraction\Denominator
   Repeat
      Mod = Numerator % Denominator
      If Mod
         Numerator = Denominator
         Denominator = Mod
      EndIf
   Until Mod = 0
   *Fraction\Numerator / Denominator
   *Fraction\Denominator / Denominator
EndProcedure

; Gibt einen Bruch als Zeichenkette zurück.
Procedure.s ExportFraction(*Fraction.Fraction)
   ProcedureReturn Str(*Fraction\Numerator)+"/"+Str(*Fraction\Denominator)
EndProcedure


;## Beispiel

DecimalFraction(A.Fraction, 0.555)
Length.i = 255
For I = -5 To 5
	B.Fraction = A
	B\Denominator + I
	SimplifyFraction(B)
	If Len(ExportFraction(B)) < Length
		Ergebnis.s = ExportFraction(B)
		Length = Len(ExportFraction(B))
	EndIf
Next

Debug Ergebnis
Er liefert nun 5/9 , es sollte aber mit bedacht eingesetzt werden und nur bei hinreichend großen Nennern