2012-03-28 7 views
2

Ich benutze Boost.Rational 1.46. Gemäß seiner documentation,Wie kann man die Normalisierung rationaler Zahlen im Boost vermeiden?

Die letzte grundlegende Operation ist die Normalisierung eines rationalen. Dieser Vorgang wird ausgeführt immer wenn ein rationaler erstellt (und zugewiesen). Alle anderen Operationen sind darauf bedacht, die Rationals in einem normalisierten Zustand zu halten. Normalisierung kostet das Äquivalent von einem gcd und zwei Divisionen.

Für eine Anwendung mit intensiver Nutzung von relativ kleinen rationalen Werten (und daher kleinen ganzen Zahlen) ist eine Normalisierung zu teuer, um die ganze Zeit zu tun. Gibt es eine Möglichkeit, dies zu vermeiden oder nur in bestimmten Momenten zu zwingen?

+0

Denken Sie zweimal darüber nach, dies zu tun. Weil die Zwischenergebnisse den zugrunde liegenden Integer-Typ nach einigen Operationen sehr leicht überlaufen lassen können. Erstens, wenn die Zahlen (Zähler und Nenner) größer werden, dann ist es später * teurer, die Gleichung zu vereinfachen (so geht die Optimierung verloren). Zweitens leidet das Umschalten auf eine Ganzzahl mit unbegrenzter oder unbegrenzter Genauigkeit auch unter denselben Problemen, da Sie nach mehreren Vorgängen mehr und mehr Speicher verwenden müssen. Jedenfalls bin ich daran interessiert zu wissen, was deine Erfahrung war. – alfC

+0

Das war vor mehr als 3 Jahren, aber wir hatten eine Verwendung, wo wir keine Normalisierung brauchten, und wir würden nur einmal multiplizieren, so dass wir keine Bits akkumulieren würden. Außerdem verwendeten wir GCC's int128 als Integer-Typ, wobei unsere wahre Eingabe int32 war, so dass wir garantiert keine Überläufe usw. hatten. Am Ende gelang es uns jedoch, einen Algorithmus so zu modifizieren, dass er nur auf Integer-Arithmetik basierte. – Janoma

+0

Es macht Sinn, wenn der Nenner a priori begrenzt ist, ist es immer möglich, das Problem mit der reinen Integralrechnung (mögliche Vielfachgenauigkeit) zu lösen. – alfC

Antwort

2

Die Invariante der Boost rationalen Zahlen ist, dass sie immer normalisiert sind (siehe Referenz in Ihrer Frage zitiert). Wenn Sie also unnormierte Rationalwerte verwenden möchten, können Sie die Boost-Implementierung nicht verwenden.

+0

Nun, ja, deshalb frage ich, wie es geht. Eine modifizierte Version wäre in Ordnung, obwohl eine optionale Normalisierung besser wäre. – Janoma

+2

Sie könnten Ihre eigene Implementierung rollen. Um nicht bei Null anzufangen, können Sie sich [dieses Papier] ansehen (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1718.pdf) (verwiesen von [hier ] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3363.html)). Das Papier beschreibt eine rationale Bibliothek mit der Option, die Normalisierung abzuschalten. Mir ist keine (andere) Bibliothek bekannt, die diese Fähigkeit bietet. – Attila

Verwandte Themen