@fffffffffffff:
ohja, stimmt. Genau dieser Gedanke kam mir, als ich vom PC weg bin "Moment mal, .f sind ja floats". So
std::cout << "1/4: " << find_frac(1./4) << '\n';
std::cout << "1/7: " << find_frac(1./7) << '\n';
std::cout << "11/12: " << find_frac(11./12) << '\n';
bekomme ich wie erwartet:
1/4: (1/4)
1/7: (1/7)
11/12: (11/12)
@volkard:
Das ist jetzt interessant.
1. Auf der website, die sehr detailliert die Kettenbruchentwicklung beschreibt, hat der Rechner Dezimalzahl=>Bruch ein Feld, wo man bestimmen kann, wie groß maximal der Nenner sein darf. Es zeigt auch immer die Abweichung an.
Schon seit ich versuche das umzusetzten, hatte ich auch immer diesen Gedanken mit einer "Toleranz" oder "precision", um welche der ausgegebene Bruch von der Eingabe variieren darf.
@Werner
Auf den ersten Blick sah es aus, als würde der Link von dir Kettenbruchentwicklung nutzen. Werde mir das auf jeden Fall anschauen.
Danke für den Hinweis, safe_add() macht was es soll, aber ich verwende es falsch, das hab ich glatt verpennt, danke.
Ich werde mich auch um die anderen genannten Dinge kümmern.
edit: Hab einigen Quatsch entfernt... Auf jeden Fall, ich mach mich an die Arbeit, eure Hilfe soll nicht umsonst gewesen sein.
- - - - Update - - - -
v2.0:
Rational frac(double, double tolerance=1.E-4);
Rational frac(double d, double tol)
{
if (d < 0) return -frac(-d, tol);
if (d > maxint) throw std::runtime_error(
"Number too big/small to be represented by Rational type.");
Rational left(0, 1);
Rational right(1, 0);
Rational mid(0, 1);
while (std::abs(d - mid.to_double()) > tol) {
if ( !add_is_safe(left.num, right.num) ||
!add_is_safe(left.denom, right.denom) ) throw std::runtime_error(
"Tolerance too small for converting " +
std::to_string(d) + " to Rational.");
if (mid.to_double() < d) left = mid;
else right = mid;
mid = Rational(left.num + right.num, left.denom + right.denom);
}
return mid;
}
Wars ca. so gemeint?
edit: was hier stand war off-topic.
Ist die Kettenbruchmethode tatsänlich merklich besser/schneller, oder kann ichs dabei lassen? Ich verstehe nämlich die Methode oben irgendwie mehr.