<?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[Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen]]></title><description><![CDATA[<p>Guten Tag zusammen,</p>
<p>ich habe hier einen Standard, der folgendes vorgibt:</p>
<ul>
<li>Die größtmögliche Zahl passt in einen std::int64_t (hat also 8 Bytes)</li>
<li>Es kann noch ein Faktor dazukommen, der sich aus std::pow(10.0, n); ergibt</li>
</ul>
<p>Das ist schon wahnsinnig genius, denn irgendwann komme ich nicht mehr umhin, den wahren finalen Wert zu berechnen, um ihn dem Nutzer zu zeigen <a href="http://proximonivel.pt/wp-content/uploads/2013/01/senador-america-genius-pn-n.jpg" rel="nofollow">http://proximonivel.pt/wp-content/uploads/2013/01/senador-america-genius-pn-n.jpg</a></p>
<p>Wie kann ich denn jetzt feststellen, ob ich den Bereich der Variablen überschreite, wenn ich folgendes berechne:</p>
<pre><code>std::int64_t valInt = /* Initiale Zuweisung */;
double valDouble;

if (n &lt; 0) {
	valReal = static_cast&lt;double&gt;valInt * std::pow(10.0, n);
	valDouble = true;
} else {
	valInt = (valInt *  static_cast&lt;std::int64_t&gt;(std::pow(10.0, n)));
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Ich würde dann gerne eine Meldung ausgeben, das der Wert auf dem aktuellen System nicht interpretiert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327668/wie-bereichsüberschreitungen-bei-long-double-usw-feststellen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 13:32:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327668.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Aug 2014 09:09:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 09:09:49 GMT]]></title><description><![CDATA[<p>Guten Tag zusammen,</p>
<p>ich habe hier einen Standard, der folgendes vorgibt:</p>
<ul>
<li>Die größtmögliche Zahl passt in einen std::int64_t (hat also 8 Bytes)</li>
<li>Es kann noch ein Faktor dazukommen, der sich aus std::pow(10.0, n); ergibt</li>
</ul>
<p>Das ist schon wahnsinnig genius, denn irgendwann komme ich nicht mehr umhin, den wahren finalen Wert zu berechnen, um ihn dem Nutzer zu zeigen <a href="http://proximonivel.pt/wp-content/uploads/2013/01/senador-america-genius-pn-n.jpg" rel="nofollow">http://proximonivel.pt/wp-content/uploads/2013/01/senador-america-genius-pn-n.jpg</a></p>
<p>Wie kann ich denn jetzt feststellen, ob ich den Bereich der Variablen überschreite, wenn ich folgendes berechne:</p>
<pre><code>std::int64_t valInt = /* Initiale Zuweisung */;
double valDouble;

if (n &lt; 0) {
	valReal = static_cast&lt;double&gt;valInt * std::pow(10.0, n);
	valDouble = true;
} else {
	valInt = (valInt *  static_cast&lt;std::int64_t&gt;(std::pow(10.0, n)));
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Ich würde dann gerne eine Meldung ausgeben, das der Wert auf dem aktuellen System nicht interpretiert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414945</guid><dc:creator><![CDATA[DerStandard]]></dc:creator><pubDate>Tue, 26 Aug 2014 09:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 09:39:19 GMT]]></title><description><![CDATA[<p>Brauchst du nicht.</p>
<p>Für die Ausgabe reicht es aus, an die Ziffern ein paar Nullen dran zu hängen bzw. das Komma einzufügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414947</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Tue, 26 Aug 2014 09:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 09:40:06 GMT]]></title><description><![CDATA[<p>DerStandard schrieb:</p>
<blockquote>
<p>ich habe hier einen Standard, der folgendes vorgibt:</p>
<ul>
<li>Die größtmögliche Zahl passt in einen std::int64_t (hat also 8 Bytes)</li>
<li>Es kann noch ein Faktor dazukommen, der sich aus std::pow(10.0, n); ergibt</li>
</ul>
<p>Das ist schon wahnsinnig genius, denn irgendwann komme ich nicht mehr umhin, den wahren finalen Wert zu berechnen, um ihn dem Nutzer zu zeigen</p>
</blockquote>
<p>Etwas dubios. Der Nutzer will doch keinen double sehen, sondern ein paar Zeichen auf dem Bildschirm.</p>
<p>Weiter sehe ich keinen <em>speziellen</em> Grund, eine Bereichsüberschreitung bei der Konvertierung zu prüfen. Wenn du damit weiterrechnen willst, kann es auch beim zweiten oder jedem weiteren Schritt zu einer Überschreitung kommen:</p>
<p>double((1, 1e300)) * 1e300 = &quot;1e600&quot;. Die erste Zahl ist repräsentierbar, beim Weiterrechnen sprengst du den Wertebereich.</p>
<p>Du müsstest also ehrlicherweise grundsätzlich jede Rechenoperation auf Überlauf prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414948</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 26 Aug 2014 09:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 10:54:13 GMT]]></title><description><![CDATA[<p>Auf einigen Systemen gibt es eingebaute Integraltypen mit 128 Bit (GCC/Clang unterstützen bspw. <code>__int128_t</code> bzw. <code>__int128</code> )</p>
<p>Für die Zehnerpotenzen könntest du ganz nebenbei eine Lookup-Table verwenden.</p>
<blockquote>
<p>Wie kann ich denn jetzt feststellen, ob ich den Bereich der Variablen überschreite, wenn ich folgendes berechne:</p>
</blockquote>
<p>Wieso nicht</p>
<pre><code>if (valInt &gt; std::numeric_limits&lt;std::int64_t&gt;::max()/zehnerPotenz)
    // ...
</code></pre>
<p>?</p>
<p>Übrigens erzeugen Overflows mit vorzeichenbehafteten Ganzzahltypen (wie <code>std::int64_t</code> ) undefiniertes Verhalten, du solltest dich also nicht auf irgendwelche Tricks die letzteres ausnutzen verlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414949</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 26 Aug 2014 10:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 09:58:40 GMT]]></title><description><![CDATA[<p>DirkB schrieb:</p>
<blockquote>
<p>Brauchst du nicht.</p>
<p>Für die Ausgabe reicht es aus, an die Ziffern ein paar Nullen dran zu hängen bzw. das Komma einzufügen.</p>
</blockquote>
<p>Hm theoretisch schon. Praktisch wäre das dann aber eine textuelle Darstellung. D.h. in der Datenbank würde ich Text speichern. Was solange funktioniert, wie der Nutzer keine Historie von Werten als Graph sehen möchte, denn dann bräuchte ich wieder ints/doubles.</p>
<p>Würde ich die Rohwerte sowie den Faktor in der Datenbank speichern, dann müsste man das Problem in php lösen, wenn der Benutzer z.B. eine Werte-Historie sehen möchte.</p>
<p>Ist Bashar's Ansatz (&quot;Du müsstest also ehrlicherweise grundsätzlich jede Rechenoperation auf Überlauf prüfen.&quot;) der einzig legitime?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414950</guid><dc:creator><![CDATA[DerStandard]]></dc:creator><pubDate>Tue, 26 Aug 2014 09:58:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 10:11:37 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Auf einigen Systemen gibt es eingebaute Integraltypen mit 128 Bit [...]</p>
</blockquote>
<p>. o O ( Hat außer mir auch noch wer ne VAX rumstehen? Hände hoch! )</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>[...] Integraltypen [...]</p>
</blockquote>
<p>Integer reicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414951</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Tue, 26 Aug 2014 10:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 10:27:12 GMT]]></title><description><![CDATA[<p>Was haltet ihr von der Lösung in der ersten Antwort (mit den 85 &quot;likes&quot;):</p>
<p><a href="http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c" rel="nofollow">http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414952</guid><dc:creator><![CDATA[DerStandard]]></dc:creator><pubDate>Tue, 26 Aug 2014 10:27:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 10:53:32 GMT]]></title><description><![CDATA[<blockquote>
<p>Hat außer mir auch noch wer ne VAX rumstehen?</p>
</blockquote>
<p>Eingebaut ist ein Typ mMn. dann wenn er ohne Einbindung jeglicher Header verwendet werden kann. Genau das ist bei <code>__int128</code> der Fall. Falls sich dein Verständnis von &quot;eingebaut&quot; von meinem unterscheidet, lass es mich wissen <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414954</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 26 Aug 2014 10:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 11:14:01 GMT]]></title><description><![CDATA[<p>DerStandard schrieb:</p>
<blockquote>
<p>Was haltet ihr von der Lösung in der ersten Antwort (mit den 85 &quot;likes&quot;):<br />
<a href="http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c" rel="nofollow">http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c</a></p>
</blockquote>
<p>sieht nicht fein aus.</p>
<p>DerStandard schrieb:</p>
<blockquote>
<p>ich habe hier einen Standard, der folgendes vorgibt:<br />
Die größtmögliche Zahl passt in einen std::int64_t (hat also 8 Bytes)<br />
Es kann noch ein Faktor dazukommen, der sich aus std::pow(10.0, n); ergibt</p>
</blockquote>
<p>Du sollst nicht zufällig sowas wie die Fakultär von 1000 ausrechnen/anzeigen? Dann vermeide einfach die Bereichsüberschreitungen im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414956</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 26 Aug 2014 11:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 12:28:37 GMT]]></title><description><![CDATA[<p>Also das riecht für mich sehr nach &quot;decimal&quot;.<br />
Ich verstehe aber den ganzen Wirbel nicht.<br />
Wie DirkB schon in der ersten Antwort geschrieben hat braucht man für die Konvertierung in einen dezimalen (!) String keinen grösseren Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414967</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Aug 2014 12:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 14:34:10 GMT]]></title><description><![CDATA[<p>hustbaer: Eine Umwandlung in einen arithmetischen Basistyp anzubieten ist nicht völlig abwegig, auch wenn es gerade für die Textanzeige mal nicht nötig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414981</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 26 Aug 2014 14:34:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Bereichsüberschreitungen bei long&#x2F;double usw. feststellen on Tue, 26 Aug 2014 17:13:57 GMT]]></title><description><![CDATA[<p>Oh, sorry, ich hatte übersehen dass der OP selbst an der Diskussion beteiligt ist, und jetzt auch an anderen Dingen interessiert. Manchmal ist man schon was blind... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>@DerStandard<br />
Die meisten Datenbanken bieten auch einen &quot;decimal&quot; Typ an. Damit man ordentlich mit Geldbeträgen arbeiten kann.<br />
Wenn deine DB so einen Typ hat würde ich den nehmen.<br />
Wenn nicht, dann halt als Text.</p>
<p>In PHP damit zu rechnen sollte so oder so kein Problem sein: <a href="http://de2.php.net/manual/en/ref.bc.php" rel="nofollow">http://de2.php.net/manual/en/ref.bc.php</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414992</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Aug 2014 17:13:57 GMT</pubDate></item></channel></rss>