<?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[Rechnungen liefert unterschiedliche Werte]]></title><description><![CDATA[<p>Hllo Leute,</p>
<p>Ich hab ein Programm dass ich neu schreibe. Ich habe es dabei auch gleich auf 64bit kompiliert und nicht wie ursprünglich 32. Nun habe ich ein Problem, das mich verwirrt. Ich habe folgende Codezeile:</p>
<pre><code>#include &lt;cmath&gt;

//irgendwelcher code

void foo(){
//macht was

    Fit.push_back(flux_arr[0] * sin(flux_arr[1] * x[i] + flux_arr[3]) + flux_arr[2]);

//macht noch mehr
}
</code></pre>
<p>in beiden Programmen ist diese Codezeile dieselbe, die Ergebnisse allerdings nicht. Die Ergebnisse sehen folgendermaßen aus:</p>
<p>F(ursprünglich) = 95.060725762140<strong>351</strong><br />
F(jetzt) = 95.060725762140<strong>137</strong></p>
<p>Der Unterschied ist nicht groß aber da und und zieht sich auch in die Ergebnisse nachfolgender Rechnungen. Ich habs mit dem Debugger überprüft und die Eingangsparameter haben dieselben werte und dieselben Typen in beiden Fällen. Die sin() Funktion liefert aber einen abweichenden Wert in den letzten vier Stellen. Wenn ich die Rechnung Schritt für Schritt mache ist das ergebnis nach der sin() Funktion:</p>
<p>Erg1 = -0.4658569898381<strong>2873</strong><br />
Erg2 = -0.4658569898381<strong>3151</strong></p>
<p>Woher kann das kommen? Kann das an dem 32 zu 64bit dingens liegen, obwohl ich nicht verstehe wieso das sein sollte. Oder liegt das an den mathebibliotheken? Oder übersehe ich einfach was?</p>
<p>Erstellt wurde beides mit Visual Studio 2012.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328003/rechnungen-liefert-unterschiedliche-werte</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 16:09:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328003.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Sep 2014 12:29:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 12:29:51 GMT]]></title><description><![CDATA[<p>Hllo Leute,</p>
<p>Ich hab ein Programm dass ich neu schreibe. Ich habe es dabei auch gleich auf 64bit kompiliert und nicht wie ursprünglich 32. Nun habe ich ein Problem, das mich verwirrt. Ich habe folgende Codezeile:</p>
<pre><code>#include &lt;cmath&gt;

//irgendwelcher code

void foo(){
//macht was

    Fit.push_back(flux_arr[0] * sin(flux_arr[1] * x[i] + flux_arr[3]) + flux_arr[2]);

//macht noch mehr
}
</code></pre>
<p>in beiden Programmen ist diese Codezeile dieselbe, die Ergebnisse allerdings nicht. Die Ergebnisse sehen folgendermaßen aus:</p>
<p>F(ursprünglich) = 95.060725762140<strong>351</strong><br />
F(jetzt) = 95.060725762140<strong>137</strong></p>
<p>Der Unterschied ist nicht groß aber da und und zieht sich auch in die Ergebnisse nachfolgender Rechnungen. Ich habs mit dem Debugger überprüft und die Eingangsparameter haben dieselben werte und dieselben Typen in beiden Fällen. Die sin() Funktion liefert aber einen abweichenden Wert in den letzten vier Stellen. Wenn ich die Rechnung Schritt für Schritt mache ist das ergebnis nach der sin() Funktion:</p>
<p>Erg1 = -0.4658569898381<strong>2873</strong><br />
Erg2 = -0.4658569898381<strong>3151</strong></p>
<p>Woher kann das kommen? Kann das an dem 32 zu 64bit dingens liegen, obwohl ich nicht verstehe wieso das sein sollte. Oder liegt das an den mathebibliotheken? Oder übersehe ich einfach was?</p>
<p>Erstellt wurde beides mit Visual Studio 2012.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417791</guid><dc:creator><![CDATA[Freddy_Kay]]></dc:creator><pubDate>Tue, 16 Sep 2014 12:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 12:56:56 GMT]]></title><description><![CDATA[<p>x86 Prozessoren haben eine Gleitkomaeinheit die intern genauer rechnet als die übliche Gleitkommazahlbreite. Diese hat auch eine integrierte Sinus-Berechnung. Auf x86-64 wird aber für Gleitkommaberechnungen die SSE-Einheit benutzt die auch intern mit derselben Genauigkeit rechnet. Für die Berechnung des Sinus wird hier ein Software-Verfahren verwendet. Ich denke daher kommt es zu leicht unterschiedlichen Ergebnissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417794</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Tue, 16 Sep 2014 12:56:56 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 12:59:33 GMT]]></title><description><![CDATA[<p>Wie kommst du an die Zahlen? Konsolenausgabe, Debugger ... ?</p>
<p>In der Defaulteinstellung benutzt der gcc im 64 Bit Modus SSE, während er im 32 Bit Modus die FPU benutzt. Das kann zu verschiedenen Werten führen. Keine Ahnung wie das bei VS aussieht.</p>
<p>Der 64 Bit Modus hat mehr/andere Register. Das könnte sich auch hier auswirken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417795</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 16 Sep 2014 12:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 13:20:32 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>x86 Prozessoren haben eine Gleitkomaeinheit die intern genauer rechnet als die übliche Gleitkommazahlbreite. Diese hat auch eine integrierte Sinus-Berechnung. Auf x86-64 wird aber für Gleitkommaberechnungen die SSE-Einheit benutzt die auch intern mit derselben Genauigkeit rechnet. Für die Berechnung des Sinus wird hier ein Software-Verfahren verwendet. Ich denke daher kommt es zu leicht unterschiedlichen Ergebnissen.</p>
</blockquote>
<p>Ich führe beides auf demselben Rechner aus der einen x64 prozessor hat. Muss damit dieser Unterschied sichtbar wird der Prozessor physisch existieren oder ist das eine compilerinterne Einstellung, was nun verwendet wird?</p>
<p>Im Endeffekt gibt es für mich keine Möglichkeit diese Abweichung zu korrigieren solange ich weiterhin auf 64bit kompiliere? Oder kann ich den Compiler anweisen die FPU zu verwenden?</p>
<p>Meine Ergebnisse kommen übrigens aus dem Debugger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417799</guid><dc:creator><![CDATA[Freddy_Kay]]></dc:creator><pubDate>Tue, 16 Sep 2014 13:20:32 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 13:37:15 GMT]]></title><description><![CDATA[<p>was passiert, wenn die Rechnung in einzelne Schritte unterteilt wird, bei denen jeweils das Ergebnis zwischengespeichert wird? also</p>
<pre><code class="language-cpp">double a = flux_arr[1] * x[i];
double b = a + flux_arr[3];
double c = sin(b);
double d = flux_arr[0] * c;
double e = d + flux_arr[2];
Fit.push_back(e);
</code></pre>
<p>Vorausgesetzt, es werden keine zu aggressiven Matheoptimierungen vorgenommen (fastmath o.ä. ist tabu), sollte dies stets zum gleichen exakten Ergebnis führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417802</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 16 Sep 2014 13:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 13:43:35 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>was passiert, wenn die Rechnung in einzelne Schritte unterteilt wird, bei denen jeweils das Ergebnis zwischengespeichert wird? also</p>
<pre><code class="language-cpp">double a = flux_arr[1] * x[i];
double b = a + flux_arr[3];
double c = sin(b);
double d = flux_arr[0] * c;
double e = d + flux_arr[2];
Fit.push_back(e);
</code></pre>
<p>Vorausgesetzt, es werden keine zu aggressiven Matheoptimierungen vorgenommen (fastmath o.ä. ist tabu), sollte dies stets zum gleichen exakten Ergebnis führen.</p>
</blockquote>
<p>wie gesagt hab ich das bereits gemacht. Daher komm ich auch darauf, dass die sin() Funktion zur Abweichung führt. Das Zeug davor macht alles wie erwartet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417803</guid><dc:creator><![CDATA[Freddy_Kay]]></dc:creator><pubDate>Tue, 16 Sep 2014 13:43:35 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 14:31:48 GMT]]></title><description><![CDATA[<p>Freddy_Kay schrieb:</p>
<blockquote>
<p>TNA schrieb:</p>
<blockquote>
<p>x86 Prozessoren haben eine Gleitkomaeinheit die intern genauer rechnet als die übliche Gleitkommazahlbreite. Diese hat auch eine integrierte Sinus-Berechnung. Auf x86-64 wird aber für Gleitkommaberechnungen die SSE-Einheit benutzt die auch intern mit derselben Genauigkeit rechnet. Für die Berechnung des Sinus wird hier ein Software-Verfahren verwendet. Ich denke daher kommt es zu leicht unterschiedlichen Ergebnissen.</p>
</blockquote>
<p>Ich führe beides auf demselben Rechner aus der einen x64 prozessor hat. Muss damit dieser Unterschied sichtbar wird der Prozessor physisch existieren oder ist das eine compilerinterne Einstellung, was nun verwendet wird?</p>
</blockquote>
<p>Der Prozessor hat sozusagen einen getrennten Befehlssatz der für 64-Bit Code zum Einsatz kommt. Also eine Compilereinstellung zusammen mit dem Passenden Betriebssystem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417813</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Tue, 16 Sep 2014 14:31:48 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 14:40:47 GMT]]></title><description><![CDATA[<p>Es wäre zweckmäßig, mal nachzurechnen, welcher Wert korrekt ist.<br />
Ab dem Pentium garantiert Intel für die trigonometrischen Funktionen eine Abweichung von maximal 1 (binären) Stelle, sofern das Argument nicht reduziert werden musste (wenn keine errata greifen, FDIV grüsst...)<br />
Also liegt möglicherweise ein Fehler in der Software für 64-bit vor - evtl. muss die auch erst konfiguriert werden; häufig benötigt man ja nicht die volle Genauigkeit.</p>
<p>Edit: kurze Suche führt u.a. zu <a href="http://ofekshilon.com/2014/02/01/x86x64-library-numerical-differences/" rel="nofollow">http://ofekshilon.com/2014/02/01/x86x64-library-numerical-differences/</a></p>
<p>Wäre interessant zu prüfen, ob die Situation mit glibc besser aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417815</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 16 Sep 2014 14:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to Rechnungen liefert unterschiedliche Werte on Tue, 16 Sep 2014 15:36:30 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Es wäre zweckmäßig, mal nachzurechnen, welcher Wert korrekt ist.<br />
Ab dem Pentium garantiert Intel für die trigonometrischen Funktionen eine Abweichung von maximal 1 (binären) Stelle, sofern das Argument nicht reduziert werden musste (wenn keine errata greifen, FDIV grüsst...)<br />
Also liegt möglicherweise ein Fehler in der Software für 64-bit vor - evtl. muss die auch erst konfiguriert werden; häufig benötigt man ja nicht die volle Genauigkeit.</p>
<p>Edit: kurze Suche führt u.a. zu <a href="http://ofekshilon.com/2014/02/01/x86x64-library-numerical-differences/" rel="nofollow">http://ofekshilon.com/2014/02/01/x86x64-library-numerical-differences/</a></p>
<p>Wäre interessant zu prüfen, ob die Situation mit glibc besser aussieht.</p>
</blockquote>
<p>ich bin mir nicht ganz sicher, wie ich herausfinde welcher Wert korrekt ist. Mim Taschenrechner wirds schwierig, Windows Taschenrechner und wolfram alpha gibt mir:</p>
<p>-0,46585698972300337924483906930641</p>
<p>was nochmal deutlich anders ist als die beiden anderen Werte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2417829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2417829</guid><dc:creator><![CDATA[Freddy_Kay]]></dc:creator><pubDate>Tue, 16 Sep 2014 15:36:30 GMT</pubDate></item></channel></rss>