<?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[[cast float-&amp;gt;double] definiertes verhalten?]]></title><description><![CDATA[<p>Ist irgendwo im Standard definiert, was beim CAsten von einem <strong>float</strong> in einen <strong>double</strong> Wert passiert?</p>
<pre><code class="language-cpp">//Windows - MSCV 9
int   a = 2;
float b = 2.1;

double c = 0.01;      //-&gt; a = 0.010000000000000000;
float  d = 0.01;      //-&gt; b = 0.0099999998;
double e = (double)d; //-&gt; c = 0.009999999776482582;
</code></pre>
<p>Wie man schön sieht steht etwas beliebiges in derm neu hinzugekommenen Genauigkeitsbereich. Ist das standardmäßig beliebig oder kann den compiler irgendwie dazu zwingen, mir &quot;0 aufzufüllen&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209687/cast-float-gt-double-definiertes-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 18:23:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209687.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Apr 2008 11:09:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 11:09:53 GMT]]></title><description><![CDATA[<p>Ist irgendwo im Standard definiert, was beim CAsten von einem <strong>float</strong> in einen <strong>double</strong> Wert passiert?</p>
<pre><code class="language-cpp">//Windows - MSCV 9
int   a = 2;
float b = 2.1;

double c = 0.01;      //-&gt; a = 0.010000000000000000;
float  d = 0.01;      //-&gt; b = 0.0099999998;
double e = (double)d; //-&gt; c = 0.009999999776482582;
</code></pre>
<p>Wie man schön sieht steht etwas beliebiges in derm neu hinzugekommenen Genauigkeitsbereich. Ist das standardmäßig beliebig oder kann den compiler irgendwie dazu zwingen, mir &quot;0 aufzufüllen&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485113</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 02 Apr 2008 11:09:53 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 11:18:30 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p>...<br />
Wie man schön sieht steht etwas beliebiges in derm neu hinzugekommenen Genauigkeitsbereich. Ist das standardmäßig beliebig oder kann den compiler irgendwie dazu zwingen, mir &quot;0 aufzufüllen&quot;?</p>
</blockquote>
<p>Nein. Das ist auch garnicht möglich.<br />
Ist dir eigentlich bekannt das double sowie float nur Näherungsweise arbeiten?<br />
(Daher sollte man auch niemals gegen einen double oder floatwert exakt prüfen, sondern immer mit einer &quot;Nährung&quot; arbeiten).</p>
<p>0.1 lässt sich z.B. nur Nährungsweise darstellen, da es mittels einer 2er Potenz (1,2,4,8,18... sowie 0.5, 0.25, 0.125...) nicht genau darstellbar ist.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485116</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 02 Apr 2008 11:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 12:16:51 GMT]]></title><description><![CDATA[<p>naja, also gott sei dank arbeiten sie mit einer Genauigkeit von N, wäre sonst auch sehr traurig. Und das man zwei Fließkomma-Zahlen nur im Epsilon-Bereich auf Gleichheit prüft ist mir ebenfalls bekannt.</p>
<p>ABER:</p>
<pre><code class="language-cpp">float  a = 0.1;
double b = 0.1;
bool erg = std::fabs( (double)a-b )&gt;1.E-10;

//Windows + cl:
-&gt; erg=false;
//Linux gcc
-&gt; erg=true;
</code></pre>
<p>Jetzt einmal ungeachtet der Tatsache, dass immer den genaueren Tyoen auf den &quot;ungenaueren&quot; casten sollte bei einem solchen Vergleich, kommt eben compiler Abhängig etwas anderes heraus. Und daher wollte ich wissen, ob das VErhalten irgendwie definiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485163</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 02 Apr 2008 12:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 12:18:59 GMT]]></title><description><![CDATA[<p>Da fuer die groessen der einzelnen Fliesskommatypen nur Mindestwerte vorgegeben sind, aber keine fest definierten Wertebereiche, kann das Verhalten nicht definiert sein. Auf einer Plattform wo float und double die gleiche Anzahl bytes haben wird die Differenz zwischen a und b immer 0 sein. Bei allen anderen Plattformen ist das Verhalten davon abhaengig, wie gross der Unterschied in der Genauigkeit von float und double ist, und wie genau 1E-10 dargestellt werden kann.</p>
<p>Lass dir doch mal auf den verschiedenen Compilern und Plattformen ein sizeof(float) und sizeof(double) ausgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485179</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 02 Apr 2008 12:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 13:13:00 GMT]]></title><description><![CDATA[<p>also auf beiden Plattformen besitzen float und double ihre standardgroesse von 4 bzw. 8 byte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485214</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 02 Apr 2008 13:13:00 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 15:25:07 GMT]]></title><description><![CDATA[<p>Da steht nicht irgendwas beliebiges im neu hinzugekommenen bereich, sondern das gleiche.</p>
<p>Gib einfach mal dein float mit der gleichen Anzahl an Nachkommastellen aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485324</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Wed, 02 Apr 2008 15:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 15:34:42 GMT]]></title><description><![CDATA[<p>Da wird wahrscheinlich einfach die Mantisse mit Nullen aufgefüllt. Binär natürlich, im Dezimalsystem ergibt das irgendwelche beliebig aussehenden Ziffern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485336</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 02 Apr 2008 15:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 17:30:07 GMT]]></title><description><![CDATA[<p>Ponto schrieb:</p>
<blockquote>
<p>Da steht nicht irgendwas beliebiges im neu hinzugekommenen bereich, sondern das gleiche.</p>
<p>Gib einfach mal dein float mit der gleichen Anzahl an Nachkommastellen aus.</p>
</blockquote>
<p>wenn dort das gleiche stehen würde, dann würde des eps-test in beiden fällen funktionieren <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/1485394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485394</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 17:45:39 GMT]]></title><description><![CDATA[<p>Da ich deinen Code nicht kenne, kann ich nicht sagen, was du falsch machst. Aber probiere einfach den folgenden Code aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main() {

   double a = 0.01;
   float  b = 0.01;
   double c = b;

   std::cout.setf(std::ios::fixed); 
   std::cout.precision(10);
   std::cout &lt;&lt; &quot;Precision 10 double:    &quot; &lt;&lt; a &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;Precision 10 float:     &quot; &lt;&lt; b &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;Precision 10 assigned:  &quot; &lt;&lt; c &lt;&lt; std::endl;
   std::cout.precision(20);
   std::cout &lt;&lt; &quot;Precision 20 double:    &quot; &lt;&lt; a &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;Precision 20 float:     &quot; &lt;&lt; b &lt;&lt; std::endl;
   std::cout &lt;&lt; &quot;Precision 20 assigned:  &quot; &lt;&lt; c &lt;&lt; std::endl;
}
</code></pre>
<p>Du siehst, dass die Zuweisung eines float zu einem double den Wert überhaupt nicht ändert (Zumindest auf gängigen Platformen). Das ist auch ganz klar. Die zusätzlichen Bits der Mantisse eines double werden mit Nullen aufgefüllt und Nullen verändern den Wert nicht.</p>
<p>Du siehst die unterschiedlichen Werte nur deshalb, weil du bei beiden Ausgaben nicht die gleiche Präzision verwendet hast.</p>
<p>Das ist übrigends die Ausgabe auf meinem Rechner:</p>
<pre><code>ponto@burns:~/Savage2&gt; ./a.out
Precision 10 double:    0.0100000000
Precision 10 float:     0.0099999998
Precision 10 assigned:  0.0099999998
Precision 20 double:    0.01000000000000000021
Precision 20 float:     0.00999999977648258209
Precision 20 assigned:  0.00999999977648258209
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1485410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485410</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 17:49:57 GMT]]></title><description><![CDATA[<p>Wenn du die Ausgabe noch länger machst, dann siehst du, dass der GENAUE Wert, den die float Variante von 0.1 hat, dieser ist:</p>
<p>0.00999999977648258209228515625</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485414</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:49:57 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 17:50:33 GMT]]></title><description><![CDATA[<p>Du koenntest dir den float und den double byte-weise in hexadezimal-Darstellung ausgeben lassen. Dann kannst du exakt vergleichen, was die Compiler unterschiedlich machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485415</guid><dc:creator><![CDATA[Christoph@Uni]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to [cast float-&amp;gt;double] definiertes verhalten? on Wed, 02 Apr 2008 17:56:10 GMT]]></title><description><![CDATA[<p>okay, das beispiel von Punto reicht mir vollkommen. genau so sieht es bei mir eigentlich auch aus. und letztlich ist es auch s wie ich es mir gedacht habe. mus snochmal testen wieso der Vergleich beim gcc dann hingehauen hat, da ich exakt die gleichen Werte erhalte wie Punto...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1485419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1485419</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 02 Apr 2008 17:56:10 GMT</pubDate></item></channel></rss>