<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[boost::rational kuerzt nicht]]></title><description><![CDATA[<p>Hallo,<br />
ich habe das Problem, dass wen bei ich boost::rational&lt;unsigned&gt; den *= Operator benutze, die Klasse intern die Werte nicht kuerzt da der Numerator immer ungerade ist. So wird der Denominator irgendwann zu groß, und die ganze Klasse setzt alles auf 0 zurück. Gibt es da irgendwelche Tricks das Problem zu beheben, außer z.B. 64-bit Werte zu nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294979/boost-rational-kuerzt-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 15:11:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294979.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Nov 2011 19:06:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::rational kuerzt nicht on Fri, 04 Nov 2011 19:06:27 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe das Problem, dass wen bei ich boost::rational&lt;unsigned&gt; den *= Operator benutze, die Klasse intern die Werte nicht kuerzt da der Numerator immer ungerade ist. So wird der Denominator irgendwann zu groß, und die ganze Klasse setzt alles auf 0 zurück. Gibt es da irgendwelche Tricks das Problem zu beheben, außer z.B. 64-bit Werte zu nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140420</guid><dc:creator><![CDATA[RationalerDenker]]></dc:creator><pubDate>Fri, 04 Nov 2011 19:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to boost::rational kuerzt nicht on Sat, 05 Nov 2011 06:48:56 GMT]]></title><description><![CDATA[<p>ja, wenn du glaubst, dass es zu groß wird, selbst kürzen. Aber nach jeder Multiplikationen einen ggt zu suchen ist nicht wirklich effizient, deshalb machen die das wohl nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140569</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 05 Nov 2011 06:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to boost::rational kuerzt nicht on Sat, 05 Nov 2011 09:06:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5202">@otze</a>: Selber kürzen kann man nicht, boost::rational garantiert jederzeit die gekürzte Darstellung.</p>
<blockquote>
<p>Rationals are always stored in fully normalized form (ie, gcd(numerator,denominator) = 1, and the denominator is always positive).</p>
</blockquote>
<p>In der bei mir installierten Boost-Library sieht der operator*= so aus:</p>
<pre><code class="language-cpp">template &lt;typename IntType&gt;
rational&lt;IntType&gt;&amp; rational&lt;IntType&gt;::operator*= (const rational&lt;IntType&gt;&amp; r)
{
    // Protect against self-modification  // Bemerkung 1: Hä? Ist das hier nicht unnötigt?
                                          // Kostet das nicht vier Kopierkonstruktoren für nichts?
    IntType r_num = r.num;
    IntType r_den = r.den;

    // Avoid overflow and preserve normalization                                          
    IntType gcd1 = math::gcd(num, r_den); // Bemerkung 2: math::gcd ist so implementiert wie man
    IntType gcd2 = math::gcd(r_num, den); // es erwarten würde, testet also nicht nur auf Parität.
    num = (num/gcd1) * (r_num/gcd2);
    den = (den/gcd2) * (r_den/gcd1);
    return *this;
}
</code></pre>
<p>RationalerDenker, weshalb meinst du den, dass nicht gekürzt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140588</guid><dc:creator><![CDATA[SchieferDenker]]></dc:creator><pubDate>Sat, 05 Nov 2011 09:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to boost::rational kuerzt nicht on Sat, 05 Nov 2011 11:56:54 GMT]]></title><description><![CDATA[<p>oh ich kannte die Biliothek nicht. ich habs nur daraus geschlossen, dass du gesagt hast, dass er nicht kürzt, weil der Numerator immer ungerade ist. Aber ungerade ist kein Kriterium für ggt(a,b) = 1.</p>
<p>Daraus schließe ich: boost::rational kürzt -&gt;zähler und nenner sind zueinander prim-&gt;du brauchst einen größeren Datentyp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2140622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2140622</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 05 Nov 2011 11:56:54 GMT</pubDate></item></channel></rss>