Diskussion:C++-Programmierung/ Brüche/ Umwandlung aus anderen Datentypen

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Abschnitt hinzufügen
Aus Wikibooks
Letzter Kommentar: vor 16 Jahren von RokerHRO in Abschnitt Umwandlung double -> Bruch

unsigned 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)Beantworten

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)Beantworten


  1. http://www.ginac.de/CLN/cln_4.html#SEC41