<?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[Double vergleichen]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ich bin gerade darüber gestolpert, dass mein Standardverfahren eine Funktion zu berechnen leider nicht funktioniert. Geben sei z.B. eine einfache zusammengesetzte Funktion:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;math.h&gt;

double f(double &amp; x)
{
	if(x &lt; 1)
		return 2*x;

	return x*x;
}

int main()
{
	double const x_min = -5.0;
	double const x_max = 5.0;
	double const dx = 0.1;

	double x = x_min;

	while(x &lt; x_max)
	{
		std::cout &lt;&lt; x &lt;&lt; &quot;\t&quot; &lt;&lt; f(x) &lt;&lt; std::endl;
		x += dx;
	}
}
</code></pre>
<p>Wenn ich jetzt an die kritische Stelle <code>x=1</code> in den Datensatz schaue, dann erblicke ich folgendes</p>
<pre><code>0.7	1.4
0.8	1.6
0.9	1.8
1	2
1.1	1.21
1.2	1.44
1.3	1.69
</code></pre>
<p>Verdammt, für <code>x=1</code> wurde also noch mit dem linearen Anteil der Funktion gerechnet, weil scheinbar <code>if(x&lt;1)</code> für <code>x=1</code> kein <code>false</code> zurückgibt.<br />
Jetzt habe ich gelesen, dass man <code>double</code> Variablen nicht vergleichen sollte, weil der Vergleich durch die Darstellung nicht eindeutig ist. Vielmehr sollte man im Falle eines Vergleichs mit der Differenz und einer gewünschten Genauigkeit arbeiten.</p>
<p>Dies führt mich zu der konzeptionellen Frage: Muss ich das hier auch berücksichtigen? Die offensichtliche Antwort wäre: &quot;Ja, immerhin vergleiche ich in der if-Abfrage zwei <code>double</code> s!&quot;</p>
<p>Oder gibt es einen eleganteren Weg zur Auswertung einer Funktion für verschiedene Eingabewerte?</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316693/double-vergleichen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 22:29:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316693.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 May 2013 09:37:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 09:37:38 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>ich bin gerade darüber gestolpert, dass mein Standardverfahren eine Funktion zu berechnen leider nicht funktioniert. Geben sei z.B. eine einfache zusammengesetzte Funktion:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;math.h&gt;

double f(double &amp; x)
{
	if(x &lt; 1)
		return 2*x;

	return x*x;
}

int main()
{
	double const x_min = -5.0;
	double const x_max = 5.0;
	double const dx = 0.1;

	double x = x_min;

	while(x &lt; x_max)
	{
		std::cout &lt;&lt; x &lt;&lt; &quot;\t&quot; &lt;&lt; f(x) &lt;&lt; std::endl;
		x += dx;
	}
}
</code></pre>
<p>Wenn ich jetzt an die kritische Stelle <code>x=1</code> in den Datensatz schaue, dann erblicke ich folgendes</p>
<pre><code>0.7	1.4
0.8	1.6
0.9	1.8
1	2
1.1	1.21
1.2	1.44
1.3	1.69
</code></pre>
<p>Verdammt, für <code>x=1</code> wurde also noch mit dem linearen Anteil der Funktion gerechnet, weil scheinbar <code>if(x&lt;1)</code> für <code>x=1</code> kein <code>false</code> zurückgibt.<br />
Jetzt habe ich gelesen, dass man <code>double</code> Variablen nicht vergleichen sollte, weil der Vergleich durch die Darstellung nicht eindeutig ist. Vielmehr sollte man im Falle eines Vergleichs mit der Differenz und einer gewünschten Genauigkeit arbeiten.</p>
<p>Dies führt mich zu der konzeptionellen Frage: Muss ich das hier auch berücksichtigen? Die offensichtliche Antwort wäre: &quot;Ja, immerhin vergleiche ich in der if-Abfrage zwei <code>double</code> s!&quot;</p>
<p>Oder gibt es einen eleganteren Weg zur Auswertung einer Funktion für verschiedene Eingabewerte?</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322947</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Mon, 13 May 2013 09:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 09:48:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Verdammt, für x=1 wurde also noch mit dem linearen Anteil der Funktion gerechnet, weil scheinbar if(x&lt;1) für x=1 kein false zurückgibt.</p>
</blockquote>
<p>1 ist ja auch nicht &lt; 1. 1 ist 1. Nicht kleiner, nicht größer. Vielleicht aber willst du if(x &lt;= 1)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322948</guid><dc:creator><![CDATA[Lokart]]></dc:creator><pubDate>Mon, 13 May 2013 09:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 10:00:04 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Jetzt habe ich gelesen, dass man <code>double</code> Variablen nicht vergleichen sollte, weil der Vergleich durch die Darstellung nicht eindeutig ist. Vielmehr sollte man im Falle eines Vergleichs mit der Differenz und einer gewünschten Genauigkeit arbeiten.</p>
</blockquote>
<p>Ja, sowas liest man öfter.<br />
Alle Generalisierungen sind falsch.<br />
Schon bemerkt, daß die Schleife manchmal die Obergrenze erreicht und manchmal nicht bei anderen Schrittweiten?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;math.h&gt;

double f(double x)
{
	if(x &lt; 1)
		return 2*x;

	return x*x;
}

int main()
{
	for(int i=-5;i&lt;=5;++i)
	{
                double x=double(i)/10;
		std::cout &lt;&lt; x &lt;&lt; '\t' &lt;&lt; f(x) &lt;&lt; '\n';
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2322951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322951</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 13 May 2013 10:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 10:05:01 GMT]]></title><description><![CDATA[<p>Das hat nichts mit dem Vergleich, wohl aber mit den Rundungsfehlern bei der Addition zu tun.<br />
Dein Problem steht in Zeile 23 Deines Programms.<br />
50x +=dx gibt eben nicht 5, sondern etwas anderes, da 0.1 binär nicht exakt darstellbar ist.</p>
<p>In Deinem Fall besser wäre:</p>
<pre><code>int main()
{
    double const x_min = -5.0;
    double const x_max = 5.0;
    double const dx = 0.1;

    // double x = x_min;
    //while(x &lt; x_max)
    int N = int((x_max - x_min)/dx + 0.5); // Anzahl der Durchläufe bestimmen
    for( int i=0; i&lt;=N; ++i )
    {
        double x = x_min + i * dx;
        std::cout &lt;&lt; x &lt;&lt; &quot;\t&quot; &lt;&lt; f(x) &lt;&lt; std::endl;
        // x += dx;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2322953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322953</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Mon, 13 May 2013 10:05:01 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 10:05:08 GMT]]></title><description><![CDATA[<p><a href="http://ideone.com/QWahO3" rel="nofollow">Hier</a> kannst Du sehen, was bei dir wirklich passiert. Und dann ist auch klar, warum man u.U. mit Delta und Wunschgenauigkeit arbeitet, bzw. warum man wissen sollte, was im Rechner vorsichgeht(siehe volkards Beitrag).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322954</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Mon, 13 May 2013 10:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 10:21:07 GMT]]></title><description><![CDATA[<p>Werner_logoff schrieb:</p>
<blockquote>
<pre><code>double x = x_min + i * dx;
</code></pre>
</blockquote>
<pre><code>double x = x_min + i * dx;//Teufel-Beelzebub-Alarm
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2322956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322956</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 13 May 2013 10:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 10:20:51 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Werner_logoff schrieb:</p>
<blockquote>
<pre><code>double x = x_min + i * dx;//Teufel-Beelzebub-Alarm
</code></pre>
</blockquote>
</blockquote>
<p>Nö! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322958</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Mon, 13 May 2013 10:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 10:39:19 GMT]]></title><description><![CDATA[<p>Werner_logoff schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Werner_logoff schrieb:</p>
<blockquote>
<pre><code>double x = x_min + i * dx;//Teufel-Beelzebub-Alarm
</code></pre>
</blockquote>
</blockquote>
<p>Nö! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Mit Schrittweiten 1/7, 1/9 klappts nicht, mit 1/11 und 1/13 klappts. Komisch.</p>
<pre><code>double x = x_min + i*(x_max-x_min) / N;//toi toi toi
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2322965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322965</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 13 May 2013 10:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 11:45:47 GMT]]></title><description><![CDATA[<p>Aha.</p>
<p>Caligulaminus schrieb:</p>
<blockquote>
<p><a href="http://ideone.com/QWahO3" rel="nofollow">Hier</a> kannst Du sehen, was bei dir wirklich passiert. Und dann ist auch klar, warum man u.U. mit Delta und Wunschgenauigkeit arbeitet, bzw. warum man wissen sollte, was im Rechner vorsichgeht(siehe volkards Beitrag).</p>
</blockquote>
<p>Und die Kernaussage ist, dass ich mir durch beständiges Aufaddieren einen ziemlichen Rundungsfehler einfange?</p>
<p>Werner_logoff schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Werner_logoff schrieb:</p>
<blockquote>
<pre><code>double x = x_min + i * dx;//Teufel-Beelzebub-Alarm
</code></pre>
</blockquote>
</blockquote>
<p>Nö! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Und wie ist das zu verstehen?<br />
Diese Darstellung kenne ich auch: Ich suche mir ein Intervall, bestimmte die Anzahl der Diskretisierungspunkte und gehe dann wie in dem Zitat vor.</p>
<p>Was ist daran der <em>Beelzebub</em>-Faktor oder auch gerade nicht? Scheinbar sind sich Werner_logoff und volkard nicht einig? <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>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322982</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Mon, 13 May 2013 11:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Mon, 13 May 2013 12:04:46 GMT]]></title><description><![CDATA[<p>Das Problem wird durch Werners Vorschlag nicht behoben. Probier zum Beispiel mal Schrittweite 1./49. Gleiches Problem, gleiche Ursache. 249*(1./49) &lt; 6.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322988</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 13 May 2013 12:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Tue, 14 May 2013 08:27:27 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das Problem wird durch Werners Vorschlag nicht behoben. Probier zum Beispiel mal Schrittweite 1./49. Gleiches Problem, gleiche Ursache. 249*(1./49) &lt; 6.</p>
</blockquote>
<p>SeppJ meint 294*(1./49)&lt;6<br />
Die 49 ist tatsächlich die erste Zahl bei der der 'Beelzebub' zuschlägt. Ich war bisher der Meinung, dass bei einer reinen Multiplikation oder Division solche Art Rundungsfehler nicht auftreten - aber man lernt ja nie aus.<br />
Interessanterweise habe ich das mal genauso in grauer Vorzeit an der Uni gelernt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36514">@Klaus</a>: da stellt sich natürlich auch die Frage, welche Anforderungen Du an die Iteration stellst.<br />
Die Vorgabe in Deinem Programm sind die (beliebig wählbaren!) Parameter <code>x_min</code> , <code>x_max</code> und <code>dx</code> und implizit stellst Du anscheinend die Anforderung, dass die Zahl 1 ein Element Deiner Iteration sein soll.<br />
Wie müsste dann volkards Lösung allgemein aussehen - z.B. mit einem <code>dx=0.08</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2323168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2323168</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 14 May 2013 08:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Double vergleichen on Wed, 15 May 2013 09:59:46 GMT]]></title><description><![CDATA[<p>Hallo Werner,</p>
<p>Werner_logoff schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/36514">@Klaus</a>: da stellt sich natürlich auch die Frage, welche Anforderungen Du an die Iteration stellst.<br />
Die Vorgabe in Deinem Programm sind die (beliebig wählbaren!) Parameter <code>x_min</code> , <code>x_max</code> und <code>dx</code> und implizit stellst Du anscheinend die Anforderung, dass die Zahl 1 ein Element Deiner Iteration sein soll.</p>
</blockquote>
<p>Das Programm im Eingangspost ist ein kompilierfähgies Minimalbeispiel, anhand dessen ich die Problematik diskutieren wollte.</p>
<p>Unabhängig davon bleibt aber der Kern deiner Aussage bestehen, dass ich in meinem Hauptpogramm auch die Diskretisierung derart wähle, dass ausgezeichnete Werte einer if-Abfrage genau angenommen werden.<br />
Allerdings führte dies bisher nie zu seltsamen Ergebnissen oder einem Runtime-Error o.ä. Glück?</p>
<p>Nur nachdem mir dies bei erneutem Nachdenken und Ausprobieren explizit aufgefallen ist, möchte ich natürlich Gewissheit, dass die if Abfrage auch genau das tut was sie soll.</p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2323478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2323478</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 15 May 2013 09:59:46 GMT</pubDate></item></channel></rss>