<?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[modf liefert falsche Werte]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem mit modf(). Wenn ich mir z.B die Zahl 8811,0635 in Ganzahl- und Dezimalteil zerlegen lasse, kommt für den Dezimalteil sowas wie 0.063500000000203727 dabei heraus. Deswegen erhalte ich in meinen Programm falsche Werte.</p>
<p>Hier der Beispiel-Quellcode:</p>
<pre><code class="language-cpp">double IntegerPart;
double DecimalPart = std::modf(8811.0635);
</code></pre>
<p>DecimalPart hat dann den Wert 0.063500000000203727.<br />
Wodran liegt es, dass modf solche Werte liefert?</p>
<p>Ich hoffe ihr könnt mir helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264509/modf-liefert-falsche-werte</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 18:56:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264509.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Apr 2010 16:24:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 16:24:57 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem mit modf(). Wenn ich mir z.B die Zahl 8811,0635 in Ganzahl- und Dezimalteil zerlegen lasse, kommt für den Dezimalteil sowas wie 0.063500000000203727 dabei heraus. Deswegen erhalte ich in meinen Programm falsche Werte.</p>
<p>Hier der Beispiel-Quellcode:</p>
<pre><code class="language-cpp">double IntegerPart;
double DecimalPart = std::modf(8811.0635);
</code></pre>
<p>DecimalPart hat dann den Wert 0.063500000000203727.<br />
Wodran liegt es, dass modf solche Werte liefert?</p>
<p>Ich hoffe ihr könnt mir helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879522</guid><dc:creator><![CDATA[Henry Rust]]></dc:creator><pubDate>Thu, 08 Apr 2010 16:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 16:33:43 GMT]]></title><description><![CDATA[<p>Weil immer 8811.06350000000020372681319713592529296875 drin war. Viele Dezimalzahlen passen in einen double nämlich nicht ganz genau rein. Deswegen mußt der Compiler die nächstliegende reinstopfen, die eben um 0.00000000000020372681319713592529296875 größer war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879525</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 08 Apr 2010 16:33:43 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 16:34:26 GMT]]></title><description><![CDATA[<p>Das liegt daran, dass endlich lange Dezimalzahlen im Binärsystem (das dein Computer benutzt) teilweise unendlich lang sein können. So wie das Ergebnis von 1/3 im Dezimalsystem 0,333... ist, in einem System zur Basis 3 ist es aber <strong>exakt</strong> 0,1. Die Zahl 0,0635 zählt anscheinend zu diesen Zahlen (ich hab's jetzt nicht nachgerechnet). Da der Computer aber nur eine endliche Zahl von Stellen speichern kann, muss er die Zahl irgendwo runden. Und wenn man dann wieder zurückrechnet, bekommt man im Dezimalsystem einen geringfügig anderen Wert als vorher.</p>
<p>Wenn ich andererseits nachfragen darf: Was hast du denn für ein Problem, bei dem eine Zahl auf mehr als 12 Nachkommastellen genau sein muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879530</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 08 Apr 2010 16:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 16:47:05 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das liegt daran, dass endlich lange Dezimalzahlen im Binärsystem (das dein Computer benutzt) teilweise unendlich lang sein können. So wie das Ergebnis von 1/3 im Dezimalsystem 0,333... ist, in einem System zur Basis 3 ist es aber <strong>exakt</strong> 0,1. Die Zahl 0,0635 zählt anscheinend zu diesen Zahlen (ich hab's jetzt nicht nachgerechnet). Da der Computer aber nur eine endliche Zahl von Stellen speichern kann, muss er die Zahl irgendwo runden. Und wenn man dann wieder zurückrechnet, bekommt man im Dezimalsystem einen geringfügig anderen Wert als vorher.</p>
<p>Wenn ich andererseits nachfragen darf: Was hast du denn für ein Problem, bei dem eine Zahl auf mehr als 12 Nachkommastellen genau sein muss?</p>
</blockquote>
<p>Ich muss wissen wie viele Stellen eine Zahl insgesamt hat. Dazu habe ich folgenden Code:</p>
<pre><code class="language-cpp">template&lt;class T&gt; unsigned int getNumberOfDigits(T number) {
		T IntegerPart;
		T DecimalPart = std::modf(number, &amp;IntegerPart);
		unsigned int NumberOfDigits = 1;	//Die Zahlen sollten normalerweise größer oder gleich 1 sein
		if(IntegerPart == 0) {			//Bei Zahlen kleiner als 1 soll die 0 vor dem Komma nicht mit gezählt werden
			NumberOfDigits = 0;
		}
		for(; (IntegerPart / 10) &gt;= 1; NumberOfDigits++) {
			IntegerPart /= 10;
		}
		for(; std::modf(DecimalPart, &amp;IntegerPart) != 0; NumberOfDigits++) {
			DecimalPart *= 10;
		}
		return NumberOfDigits;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879539</guid><dc:creator><![CDATA[Henry Rust]]></dc:creator><pubDate>Thu, 08 Apr 2010 16:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 16:53:38 GMT]]></title><description><![CDATA[<p>Henry Rust schrieb:</p>
<blockquote>
<p>Ich muss wissen wie viele Stellen eine Zahl insgesamt hat.</p>
</blockquote>
<p>Das geht nicht. Bereits 0.1 ist nicht genau als double darstellbar.<br />
Du könntest allenfalls die Zahl mit &lt;&lt; zum Beispiel in einen stringstream ausgeben und die ausgegebenen Ziffern zählen. Das wäre zwar nicht genauer, aber gleichwillkürlich wie die gewohnte Ausgabe auf cout.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879542</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 08 Apr 2010 16:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 17:01:26 GMT]]></title><description><![CDATA[<p>Ok, dann kann ich mein gesamtes Programm neu schreiben.</p>
<p>Trotzdem danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879552</guid><dc:creator><![CDATA[Henry Rust]]></dc:creator><pubDate>Thu, 08 Apr 2010 17:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 21:10:36 GMT]]></title><description><![CDATA[<p>Du solltest vielleicht ein exaktes und dynamisches Format verwenden. Es gibt sicher vorgefertigte Libraries dafür, aber zur Not würde es auch ein Container mit Ziffern tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879689</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 08 Apr 2010 21:10:36 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 21:13:11 GMT]]></title><description><![CDATA[<p>Oder Bruchzahlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879690</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 08 Apr 2010 21:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 21:16:49 GMT]]></title><description><![CDATA[<p>Gute Idee. Für Brüche gäbs mit <a href="http://www.boost.org/doc/libs/1_42_0/libs/rational/index.html" rel="nofollow">Boost.Rational</a> sogar was in Boost.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879693</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 08 Apr 2010 21:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to modf liefert falsche Werte on Thu, 08 Apr 2010 22:30:13 GMT]]></title><description><![CDATA[<p>Das lernt man bereits in der Schule oder in der Mathevorlesung: in jedem Zahlensystem (hier dezimal = 10) gibt es zwischen zwei darstellbaren Zahlen unendlich viele weitere. Wo ist das Problem? Eine tatsächlich genaue Anzahl Nachkommastellen gibt es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879740</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Thu, 08 Apr 2010 22:30:13 GMT</pubDate></item></channel></rss>