<?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[Festkomma-Arithmetik]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mich in den letzten Tagen damit beschäftigt, ob ich es hinbekomme, eine Template-Bibliothek für Festkomma-Arithmetik umzusetzen. Ich habe mir das recht einfach vorgestellt, und zunächst einmal kann man sich damit natürlich allerhand magische Konstanten usw. sparen, allerdings bleibt da immer das Problem der Korrektheit bestehen.<br />
Wenn man sich die Festkomma-Berechnungen in normalen C-Programmen so anschaut, so sind sie meist recht kurz ausgedrückt, strotzen vor magischen Konstanten, und sind durchspickt von Annahmen die nirgends tatsächlich überprüft werden und eben auch nur implizit im Code stehen.<br />
Wenn ich nun aber eine Template-Bibliothek bastele, dann muss diese ja zunächst einmal korrekt arbeiten, das heißt, man muss ihr explizit sagen, was sie durchführen darf (Rundungen etc.). Das führt nach meinem jetztigen Stand dazu, dass die Berechnung mit dieser Bibliothek zwar korrekt sind und man explizit sieht welche Tradeoffs in der Berechnung gemacht werden (und dass die Bibliothek Annahmen auch tatsächlich überprüfen kann), allerdings sind die Berechnungen im Quelltext so auch sehr viel ausufernder, also kein &quot;int32((int64(a)&lt;&lt;20)/(foo&gt;&gt;2)) + (d&gt;&gt;2)&quot; mehr, sondern eben &quot;sub&lt; Annahmen &gt;(div&lt; Annahmen &gt;(a, foo), d)&quot; z.B..<br />
Außerdem finde ich eigentlich keinen praktibalen Ansatz um die gewöhnlichen Operatoren für die Berechnungen zu benutzen, weil die ja im Allgemeinen die pessimistischsten Annahmen zum Willen des Programmierers treffen müssten (3.3 + 3.3 = 4.3, usw.), und die Berechnungen somit schnell unpraktikabel werden, wenn man nicht am Anfang extrem mit signifikanten Stellen geizt.</p>
<p>Daher meine Frage: Könnt ihr euch vorstellen, dass eine solche Bibliothek auf Aktzeptanz stoßen kann, wenn man mit ihr praktisch dazu gezwungen wird, ausführlicher zu schreiben, was passieren soll, egal ob man damit magische Konstanten vermeidet, problematische C-Typkonvertierungen umschifft werden, Wertebreiche überprüft werden können usw.?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333598/festkomma-arithmetik</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 18:29:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333598.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Jul 2015 17:37:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Festkomma-Arithmetik on Fri, 17 Jul 2015 17:37:04 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mich in den letzten Tagen damit beschäftigt, ob ich es hinbekomme, eine Template-Bibliothek für Festkomma-Arithmetik umzusetzen. Ich habe mir das recht einfach vorgestellt, und zunächst einmal kann man sich damit natürlich allerhand magische Konstanten usw. sparen, allerdings bleibt da immer das Problem der Korrektheit bestehen.<br />
Wenn man sich die Festkomma-Berechnungen in normalen C-Programmen so anschaut, so sind sie meist recht kurz ausgedrückt, strotzen vor magischen Konstanten, und sind durchspickt von Annahmen die nirgends tatsächlich überprüft werden und eben auch nur implizit im Code stehen.<br />
Wenn ich nun aber eine Template-Bibliothek bastele, dann muss diese ja zunächst einmal korrekt arbeiten, das heißt, man muss ihr explizit sagen, was sie durchführen darf (Rundungen etc.). Das führt nach meinem jetztigen Stand dazu, dass die Berechnung mit dieser Bibliothek zwar korrekt sind und man explizit sieht welche Tradeoffs in der Berechnung gemacht werden (und dass die Bibliothek Annahmen auch tatsächlich überprüfen kann), allerdings sind die Berechnungen im Quelltext so auch sehr viel ausufernder, also kein &quot;int32((int64(a)&lt;&lt;20)/(foo&gt;&gt;2)) + (d&gt;&gt;2)&quot; mehr, sondern eben &quot;sub&lt; Annahmen &gt;(div&lt; Annahmen &gt;(a, foo), d)&quot; z.B..<br />
Außerdem finde ich eigentlich keinen praktibalen Ansatz um die gewöhnlichen Operatoren für die Berechnungen zu benutzen, weil die ja im Allgemeinen die pessimistischsten Annahmen zum Willen des Programmierers treffen müssten (3.3 + 3.3 = 4.3, usw.), und die Berechnungen somit schnell unpraktikabel werden, wenn man nicht am Anfang extrem mit signifikanten Stellen geizt.</p>
<p>Daher meine Frage: Könnt ihr euch vorstellen, dass eine solche Bibliothek auf Aktzeptanz stoßen kann, wenn man mit ihr praktisch dazu gezwungen wird, ausführlicher zu schreiben, was passieren soll, egal ob man damit magische Konstanten vermeidet, problematische C-Typkonvertierungen umschifft werden, Wertebreiche überprüft werden können usw.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2460144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460144</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Fri, 17 Jul 2015 17:37:04 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Mon, 20 Jul 2015 15:40:54 GMT]]></title><description><![CDATA[<p>Also Code sagt ja bekanntlich mehr als tausend Worte.<br />
Würdet ihr das so verwenden wollen?</p>
<pre><code class="language-cpp">void divbla() {
	using nom = fix::sfixed&lt;10, 12&gt;;
	using den = fix::sfixed&lt;2, 5&gt;;

	constexpr auto result = fix::div&lt;fix::fits&lt;3,5&gt;, fix::positive, fix::towards_zero&gt;(nom::from(-3.213), den::from(-1.523));
	static_assert(std::is_same&lt;std::decay_t&lt;decltype(result)&gt;, fix::ufixed&lt;3, 5&gt;&gt;::value, &quot;Foooo!&quot;);
	constexpr auto value = result.to&lt;double&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2460439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460439</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Mon, 20 Jul 2015 15:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Mon, 20 Jul 2015 15:49:53 GMT]]></title><description><![CDATA[<p>Wobei man es natürlich auch kurz haben kann, aber dann natürlich kaum Kontrolle über das Ergebnis hat...</p>
<pre><code class="language-cpp">void divbla2()
{
	using nom = fix::sfixed&lt;10, 12&gt;;
	using den = fix::sfixed&lt;2, 5&gt;;

	constexpr auto result = fix::div&lt;fix::positive&gt;(nom::from(-3.213), den::from(-1.523));
	static_assert(std::is_same&lt;std::decay_t&lt;decltype(result)&gt;, fix::ufixed&lt;15,17&gt;&gt;::value, &quot;Foooo!&quot;);
	constexpr auto value = result.to&lt;double&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2460440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460440</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Mon, 20 Jul 2015 15:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Mon, 20 Jul 2015 18:21:43 GMT]]></title><description><![CDATA[<p>Naja, ich schätze mal man käme als Anwender mit einer überschaubaren Anzahl von Aliasen normalerweise ganz gut klar:</p>
<pre><code>auto div = fix::div&lt;fix::fits&lt;3,5&gt;, fix::positive, fix::towards_zero&gt;;

auto result = div(nom::from(-3.213), den::from(-1.523));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2460450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460450</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Mon, 20 Jul 2015 18:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Tue, 21 Jul 2015 06:48:12 GMT]]></title><description><![CDATA[<p>Bis auf sehr spezielle Faelle wuerde niemand sowas verwenden wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2460487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460487</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Tue, 21 Jul 2015 06:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Wed, 22 Jul 2015 16:27:29 GMT]]></title><description><![CDATA[<p>Care to elaborate? Klingt irgendwie dünn, die Argumentation <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2460655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460655</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 22 Jul 2015 16:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Thu, 23 Jul 2015 08:28:36 GMT]]></title><description><![CDATA[<p>Genau der Grund.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2460680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460680</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Thu, 23 Jul 2015 08:28:36 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Thu, 23 Jul 2015 14:44:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt; int I, int F &gt;
constexpr auto sine3_1stq(fix::sfixed&lt;I, F&gt; angle)
{
	// &quot;taylor&quot;: 1/2 * angle * (3 - angle*angle)
	// wasting a bit, since the lib doesnt know that angle is always [-1 ... +1] (maybe add max/min to the type?) :(
	return (angle * (FIXED_INTEGER(3) - angle*angle)).virtual_shift&lt;-1&gt;();
}

template&lt; int I &gt;
constexpr auto sine3(fix::sfixed&lt;I, 0&gt; angle)
{
	return sine3_1stq(angle.virtual_shift&lt;-I+1&gt;());
}

#define CA constexpr auto

void sine_test2()
{
	using namespace fix;
	CA angle = sfixed&lt;12, 0&gt;(222);
	CA angle_val = angle.virtual_shift&lt;-23&gt;().to&lt;double&gt;() * 90;
	CA val = sine3(angle);		// type is sfixed 3.13
	CA conv = val.to&lt;double&gt;();
}
</code></pre>
<p>Wenn man einfach die Anzahl der signifikanten Bits (bzw. Bits der Quelloperanden) als Zielgröße festlegt, als Standard, funktioniert das schon ganz gut! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Wenn man außerdem jetzt noch den Min- und Maxwert mitgeben würde, für jeden Wert, dann würden auch keine Bits verschwendet werden. Aber irgendwie habe ich im Moment erstmal keine Lust mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Zwischenergebnisse unter <a href="https://github.com/decimad/fixed" rel="nofollow">https://github.com/decimad/fixed</a> zu finden (fixedtest.cpp zeigt dann das ganze Ausmaß des Verbrechens). Der Offset-Member ist letztlich leider total unnütz, denke ich.<br />
Ist jede Menge undefined dingsbums drin und wohl auch ansonten Fehler... Nehme gerne Hinweise auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2460748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460748</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 23 Jul 2015 14:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to Festkomma-Arithmetik on Sat, 25 Jul 2015 02:08:43 GMT]]></title><description><![CDATA[<p>So, jetzt werden auch die Wertebereiche mitgeschoben durch die Rechnungen...<br />
Was ich echt cool finde ist, wie Visual C++ 2015 das alles mit IntelliSense durchrechnet... Weiß jemand ob man Eclipse-CDT auch irgendwie dazu bewegen kann?</p>
<p>Und noch eine andere Sache... während man das so mit Templates hinbugsiert nervt außerordentlich, dass man für die Compile-Zeit nicht einen Integer-Typ hat, der größer ist als alle Integer-Typen, die Laufzeitunterstützung haben. In dem Korsett die Grenzfälle hinzubekommen macht keinen Spaß... Würde mich freuen, falls mich jemand auf bessere Lösungen aufmerksam machen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2460913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2460913</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Sat, 25 Jul 2015 02:08:43 GMT</pubDate></item></channel></rss>