Diskussion:C++-Programmierung/ Brüche/ Umwandlung aus anderen Datentypen
Abschnitt hinzufügenunsigned Nenner[Bearbeiten]
Es ist eine naheliegende, aber schlechte Idee, den Nenner unsigned
zu machen. Probiere mal folgendes aus: Bruch b(1,-2);
. b ist mitnichten , sondern , was die meisten doch sehr überraschen dürfte. --RokerHRO 11:56, 3. Jan. 2008 (CET)
Umwandlung double -> Bruch[Bearbeiten]
Dein Algorithmus ist nett, aber er erzeugt etwa bei Bruch b(0.2);
nicht wie erwartet , sondern einen ziemlich krummen Wert mit großem Zähler und Nenner.
Es ist durchaus möglich, eine Gleitkommazahl in einen exakten Bruch umzuwandeln. Sämtliche Gleitkommazahlen sind ja Brüche mit einer Zweierpotenz im Nenner. Diesen kann man dann geeignet kürzen und hat einen Bruch, der die Gleitkommazahl exakt repräsentiert.
Noch etwas eleganter geht es, wenn man Gleitkommazahlen nicht als exakten Wert, sondern als Intervall auffasst. Denn jede Gleitkommazahl aaaa.bbbbb steht ja für alle Zahlen zwischen aaa.bbbb000... und aaa.bbbb999..., es werden die hinteren Stellen eben abgeschnitten (oder es wird kaufmännisch gerundet, je nach FPU-Einstellungen). Nun gibt es recht einfache Algorithmen, die einen exakten Bruch ermitteln, der in diesem Intervall liegt und möglichst kleine Zähler/Nenner hat. Damit würde aus Bruch b(0.2)
wieder herauskommen, ja sogar aus Bruch b(1.0/3.0)
fällt ein heraus!
Die C++-Bibliothek CLN benutzt diese beiden Varianten, um aus einer Gleitkommazahl einen Bruch zu erhalten. Die Funktionen dafür lauten rational()
und rationalize()
.[1] --RokerHRO 11:56, 3. Jan. 2008 (CET)