<?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[Sqrt algorithmus]]></title><description><![CDATA[<p>Hi,<br />
Ich sehe mir gerade ein paar algorithmen an um sqrt zu berechnen.<br />
Sollte foldendes:<br />
xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1);<br />
Nicht ersetzt werden in:<br />
xn_1 = xn - (xn * xn - a) / (2 * xn);<br />
?</p>
<p>Warum wird xn_1 auf a gesetzt ?</p>
<pre><code>float my_sqrt_newton(float a) {
	float eps = 0.00001;
	float xn_1 = a;
	float xn = 0;

	if (a &lt; 0) {
		return -1;
	}

	while (eps &lt; abs(xn_1 - xn)) {
		xn = xn_1;
		xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1);
	}

	return xn;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/331331/sqrt-algorithmus</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 17:38:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331331.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Feb 2015 04:30:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 04:30:11 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich sehe mir gerade ein paar algorithmen an um sqrt zu berechnen.<br />
Sollte foldendes:<br />
xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1);<br />
Nicht ersetzt werden in:<br />
xn_1 = xn - (xn * xn - a) / (2 * xn);<br />
?</p>
<p>Warum wird xn_1 auf a gesetzt ?</p>
<pre><code>float my_sqrt_newton(float a) {
	float eps = 0.00001;
	float xn_1 = a;
	float xn = 0;

	if (a &lt; 0) {
		return -1;
	}

	while (eps &lt; abs(xn_1 - xn)) {
		xn = xn_1;
		xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1);
	}

	return xn;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2443921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443921</guid><dc:creator><![CDATA[Mikeyy]]></dc:creator><pubDate>Mon, 23 Feb 2015 04:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 06:02:08 GMT]]></title><description><![CDATA[<p>xn_1 wird auf a gesetzt, weil du irgendwie ja deine Zahl in den Algorithmus bekommen willst.<br />
Ob du in Zeile 12 xn_1 oder xn verwendest ist egal da vorher xn = xn_1 gesetzt wird. Stilistisch schöner ist natürlich sich auf einen der beiden Werte festzulegen. Im Prinzip kannst du auch direkt mit a weiterrechnen und dir xn_1 komplett sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443923</guid><dc:creator><![CDATA[ntldr]]></dc:creator><pubDate>Mon, 23 Feb 2015 06:02:08 GMT</pubDate></item><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 12:46:00 GMT]]></title><description><![CDATA[<p>Irgendwie ja aber mit welcher begruendung? <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 />
Warum kann ich mir das xn_1 sparen? Ich muss doch priefen ob xn - xn_1 kleiner als epsion ist!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2443983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2443983</guid><dc:creator><![CDATA[Mileyy]]></dc:creator><pubDate>Mon, 23 Feb 2015 12:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 18:25:06 GMT]]></title><description><![CDATA[<p>Mikeyy schrieb:</p>
<blockquote>
<p>Hi,<br />
Ich sehe mir gerade ein paar algorithmen an um sqrt zu berechnen.<br />
Sollte foldendes:<br />
xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1);<br />
Nicht ersetzt werden in:<br />
xn_1 = xn - (xn * xn - a) / (2 * xn);<br />
?</p>
</blockquote>
<p>Ist hier egal, weil DU eine Zeile vorher xn_1 und xn gleich machst.</p>
<p>Mikeyy schrieb:</p>
<blockquote>
<p>Warum wird xn_1 auf a gesetzt ?</p>
</blockquote>
<p>Um nicht durch 0 zu teilen im ersten Schritt.<br />
Stell Dir das Newton-Verfahren gerne grafisch vor (wie in Wikipedia). Du hättest eine waagerechte Tangente und könntest gar nich so recht sagen, wo sie die x-Achse schneidet.</p>
<p>Mikeyy schrieb:</p>
<blockquote>
<p>Warum kann ich mir das xn_1 sparen? Ich muss doch priefen ob xn - xn_1 kleiner als epsion ist!</p>
</blockquote>
<p>Sehe ich Gans genauso.</p>
<p>Aber Du kannst Dir eps sparen!<br />
Mach die Schleife fußgesteuert (alter Ausdruck für do statt while).<br />
Dann biste bei der Abfrage mit x<sub>n+1</sub> immer links von X<sub>n</sub>. Hoffe ich. War doch so? Müßte es mir gerade mal grafisch vorstellen, aber nee, ist ja dein Job. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Also wenn es so ist, (bin jetzt nicht ganz sicher, daß der Start so schon ausreichend ist), dann bleibt auch immer x<sub>n+1</sub> immer links von X<sub>n</sub>. Ist ja logisch, wenn man sich die so nach oben krumem Parabel vorstellt und was passoert, wenn man schon rechts ist und eine Tangente anlegt und schaut, wo die Tangente die x-Ache schneidet.<br />
Sodele, Du brummst einfach gegen die Rechengenauigkeit der Maschine!!! Irgenwann muss sie ja aufgeben und mal x<sub>n+1</sub> rechts oder gleich X<sub>n</sub> haben, weil sie nicht unendlich viele Stellen rechnet. Dann haste sie gepackt, also sozusagen ein automatisches dynamisches eps.</p>
<p>Und kostet auch nicht viel mehr, Newton verdoppelt die genauen Stellen bei jedem Schleifenduchlauf, haste 5 sinds im nächsten Schritt 10, dann 20 und dann dürfte er wohl schon fertig sein auf normalen Maschinen. Sagen wir mal 2 Läufe mehr und dafür abs() eingespart. Also ich finde das lecker.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2444045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2444045</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 23 Feb 2015 18:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 20:14:11 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>... Du brummst einfach gegen die Rechengenauigkeit der Maschine!!! Irgenwann muss sie ja aufgeben und mal x<sub>n+1</sub> rechts oder gleich X<sub>n</sub> haben, weil sie nicht unendlich viele Stellen rechnet. Dann haste sie gepackt, also sozusagen ein automatisches dynamisches eps.</p>
</blockquote>
<p>.. könnte man meinen, man muss sich nur davor hüten am Ende die Zahlen auf Gleichheit zu prüfen. Probiert das z.B. einfach mal mit a=4000 aus. Dann bewegt sich der Algo recht zügig auf 63.245.. hin um am Ende ständig zwischen den Werten 63.2455559 und 63.2455521 hin und her zu springen. Nur gleich werden <code>xn</code> und <code>xn_1</code> in diesem Fall nie! Einen 4 Byte breiten <code>float</code> mal vorausgesetzt.</p>
<p>In dem Algo, den uns Mikeyy hier vorstellt, ist das Epsilon eine Konstante, die immer mit der absoluten Differenz der letzten beiden Ergebnisse verglichen wird. Damit ist das Epsilon für kleine Werte zu groß und für große Werte zu klein. Man probiere einfach mal 0.000009 oder 4e+9. Im ersten Fall ist das Ergebnis schlicht falsch und im zweiten Fall kehrt die Funktion nie zurück.</p>
<p>Wenn schon mit Epsilon, dann ist es besser, die verblieben Differenz zu normieren:</p>
<pre><code>while (eps &lt; abs(xn_1 - xn)/xn_1) { // Zeile 10
</code></pre>
<p>bzw. gleich</p>
<pre><code>while (xn_1 * eps &lt; abs(xn_1 - xn)) {
</code></pre>
<p>Und noch besser, man baut die Schleife - genau wie von volkard vorgeschlagen - fußgesteuert um.</p>
<p>Zum Schluss sollte man darauf achten, dass man bei Zwischenergebnissen keinen over- oder underflow erzeugt. Also statt</p>
<pre><code>xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1); // Zeile 12
</code></pre>
<p>lieber</p>
<pre><code>xn_1 = (xn + a/xn) * 0.5;
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2444062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2444062</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 23 Feb 2015 20:14:11 GMT</pubDate></item><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 20:52:51 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Probiert das z.B. einfach mal mit a=4000 aus. Dann bewegt sich der Algo recht zügig auf 63.245.. hin um am Ende ständig zwischen den Werten 63.2455559 und 63.2455521 hin und her zu springen. Nur gleich werden <code>xn</code> und <code>xn_1</code> in diesem Fall nie! Einen 4 Byte breiten <code>float</code> mal vorausgesetzt.</p>
</blockquote>
<p>Hab lustigerweise fast immer Zyklen der Längen 1, 2, 4 oder 8. Auch ohne daß die interne Darstellung eine Rolex spielt, bei beschränkten Folgen auf natürlichen Zahlen (kein Überlauf).</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Zum Schluss sollte man darauf achten, dass man bei Zwischenergebnissen keinen over- oder underflow erzeugt. Also statt</p>
<pre><code>xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1); // Zeile 12
</code></pre>
<p>lieber</p>
<pre><code>xn_1 = (xn + a/xn) * 0.5;
</code></pre>
</blockquote>
<p>Sehr feine rechnerische Umformung, die tut dem Rechner bestimmt gut. So ein Durch-Null-Teilen oder Beinahe-Durch-Null-Teilen ist halt dicht beieinander.</p>
<p>Ist zugleich geometrisch auch als ein anderer Ansatz interpretierbar: Man vermutet von der Zahl a eine Wurzel xn. Dann müßte a/xn ja auch eine Wurzel sein. Das arithmetische Mittel der beiden ist eine noch bessere Vermutung.</p>
<p>edit: Ich meinte: Man hat eine Rechtecksfläche a und eine Kantenlänge xn, die ist leider &gt; (bzw &lt;) als sqrt(a). Dann ist die andere Kante ja &lt; (bzw &gt;) als sqrt(a) und a/xn lang. Sicherlich ist die richtige Kantenlänge dazwischen. Wir nehmen als neue Schätzung das arithmetische Mittel der beiden Rechteckskanten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2444067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2444067</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 23 Feb 2015 20:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to Sqrt algorithmus on Mon, 23 Feb 2015 21:42:16 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Zum Schluss sollte man darauf achten, dass man bei Zwischenergebnissen keinen over- oder underflow erzeugt. Also statt</p>
<pre><code>xn_1 = xn - (xn_1 * xn_1 - a) / (2 * xn_1); // Zeile 12
</code></pre>
<p>lieber</p>
<pre><code>xn_1 = (xn + a/xn) * 0.5;
</code></pre>
</blockquote>
<p>Sehr feine rechnerische Umformung, die tut dem Rechner bestimmt gut. So ein Durch-Null-Teilen oder Beinahe-Durch-Null-Teilen ist halt dicht beieinander.</p>
</blockquote>
<p>was das Teilen betrifft ist meine Änderung zum Ausgangsterm gleich 0. Und damit das nicht passiert wird das ja auch vorher abgefangen (s.o.)<br />
.. und was das 'fast =0' betrifft, so kommt es ja nur auf die Wahl des 'geeigneten' Startwertes an.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>edit: Ich meinte: Man hat eine Rechtecksfläche a und eine Kantenlänge xn, die ist leider &gt; (bzw &lt;) als sqrt(a). Dann ist die andere Kante ja &lt; (bzw &gt;) als sqrt(a) und a/xn lang. Sicherlich ist die richtige Kantenlänge dazwischen. Wir nehmen als neue Schätzung das arithmetische Mittel der beiden Rechteckskanten.</p>
</blockquote>
<p>so isses: <a href="http://de.wikipedia.org/wiki/Heron-Verfahren" rel="nofollow">http://de.wikipedia.org/wiki/Heron-Verfahren</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2444071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2444071</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 23 Feb 2015 21:42:16 GMT</pubDate></item></channel></rss>