<?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[Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren]]></title><description><![CDATA[<p>Die Strings die ich in unsigned int (4byte) und float (4byte) konvertieren möchte habe ich in einem std::vector&lt; unsigned char &gt;. Ich habe auf den Anfang und auf das Ende der Zahlen einen Iterator.<br />
Fürs erste habe ich zum umwalden aus den Iterator-Sequenz einen temporären std::string erzeugt und diesen mit boost::lexical_cast in den Zieltyp umgewandelt.</p>
<p>Allerdings ist boost::lexical_cast viel zu langsam. Laut Profiler wird in boost::lexical_cast knapp 50% der Zeit verbracht.</p>
<p>atof und atoi sind nicht gerade meine Favoriten. Und da ich eh was alternatives Suche wäre es mir am liebsten, wenn ich da auch eine Iterator-Sequenz benutzen könnte.</p>
<p>Kennt da jemand etwas? Hat jemand sowas schonmal implementiert (und würde mir die Arbeit ersparen :))?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179135/was-schnelleres-als-boost-lexical_cast-um-zahlen-und-floats-zu-konvertieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 03:19:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179135.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Apr 2007 18:23:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Wed, 18 Apr 2007 18:23:37 GMT]]></title><description><![CDATA[<p>Die Strings die ich in unsigned int (4byte) und float (4byte) konvertieren möchte habe ich in einem std::vector&lt; unsigned char &gt;. Ich habe auf den Anfang und auf das Ende der Zahlen einen Iterator.<br />
Fürs erste habe ich zum umwalden aus den Iterator-Sequenz einen temporären std::string erzeugt und diesen mit boost::lexical_cast in den Zieltyp umgewandelt.</p>
<p>Allerdings ist boost::lexical_cast viel zu langsam. Laut Profiler wird in boost::lexical_cast knapp 50% der Zeit verbracht.</p>
<p>atof und atoi sind nicht gerade meine Favoriten. Und da ich eh was alternatives Suche wäre es mir am liebsten, wenn ich da auch eine Iterator-Sequenz benutzen könnte.</p>
<p>Kennt da jemand etwas? Hat jemand sowas schonmal implementiert (und würde mir die Arbeit ersparen :))?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268717</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Wed, 18 Apr 2007 18:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Wed, 18 Apr 2007 22:28:33 GMT]]></title><description><![CDATA[<p>Versuche mal das:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;streambuf&gt;
#include &lt;vector&gt;

class VectorBuf : public std::streambuf
{
public:
    VectorBuf( const std::vector&lt; unsigned char &gt;&amp; v )
    {
        if( !v.empty() )
        {
            char* p = (char*)&amp;v[0];
            setg( p, p, p + v.size() );
        }
    }
};

int main()
{
    using namespace std;
    vector&lt; unsigned char &gt; v;
    v.push_back( '1' );
    v.push_back( '.' );
    v.push_back( '5' );

    VectorBuf buf( v );
    istream in( &amp;buf );
    float f;
    in &gt;&gt; f;

    return 0;
}
</code></pre>
<p>stehen alle Zahlen in einem vector&lt;&gt; oder hast Du mehrere?</p>
<p>Wenn Du Wert auf die Iteratoren legst, so ginge auch noch so was</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

class ReadNum : public std::num_get&lt; unsigned char, std::vector&lt; unsigned char &gt;::iterator &gt;
{};

int main()
{
    using namespace std;
    vector&lt; unsigned char &gt; v;
    v.push_back( '1' );
    v.push_back( '.' );
    v.push_back( '5' );

    float d = 0;
    basic_ios&lt; char &gt; ios( 0 );
    ios_base::iostate err = 0;
    ReadNum read_num;
    vector&lt; unsigned char &gt;::iterator i = read_num.get( v.begin(), v.end(), ios, err, d );

    return 0;
}
</code></pre>
<p>probier's mal aus und berichte uns Deine Erfahrungen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1268873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1268873</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 18 Apr 2007 22:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 09:51:45 GMT]]></title><description><![CDATA[<p>In dem Vektor steht eine ganze Datei, die ich parse. D.h. da stehen nicht nur Zahlen drin, aber wenn ich eine Zahl gefunden habe, dann habe ich einen Anfangs- und einen Enditerator für die Zahl.</p>
<p>Die zweite Variante kommt daher in Frage, ich werde sie gleich mal testen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269097</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Thu, 19 Apr 2007 09:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 11:13:01 GMT]]></title><description><![CDATA[<p>Die zweite Variante bringt es leider ganz und gar nicht.</p>
<p>Messwerte von lexical_cast:</p>
<blockquote>
<p>float: ~44.663 cycles<br />
dword: ~31.974 cycles</p>
</blockquote>
<p>Messwerte von std::num_get:</p>
<blockquote>
<p>float: ~52.469 cycles<br />
dword: ~40.691 cycles</p>
</blockquote>
<p>Da boost::lexical_cast intern einen stringstream benutzt müsste der doch intern auch mit num_get arbeiten. Daher wundert es mich, dass der direkte Einsatz langsamer ist (code wurde von unten 1:1 übernommen für float und für dword einfach statt float unsigned int genommen).</p>
<p>P.S. Die Punkte sind Hundertertrenner und keine Dezimalpunkte. Nicht dass es hier zu missverständnissen kommt.</p>
<p>Edit:</p>
<p>Ich habe eben mal atof und atoi getestet und die Ergebnisse sind erstaunlich:</p>
<blockquote>
<p>atof: 13.886 cycles<br />
atoi: 1.867 cycles</p>
</blockquote>
<p>Ich musste für jeden der Aufrufe einen temporären std::string erzeugen.<br />
Für das Erzeugen und Zerstören hab ich leider keine Messwerte (wobei ich die beim lexical_cast auch nicht habe, da wurd auch ein temporärer String erzeugt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269147</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Thu, 19 Apr 2007 11:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 11:30:58 GMT]]></title><description><![CDATA[<p>Das atoi schnell ist, war zu vermuten. Aber du hast halt auch Komforteinbussen. Man kann nicht alles auf einmal haben, gilt hier die Devise. lexical_cast ist halt sicherer, da du z.B. eine Exception bekommst, wenn der String kein reiner Integer ist. Bei atoi bekommst du 0 zurück. Hem, war der String wirklich &quot;0&quot; oder ist die 0 ein Errorcode? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Wenn dir das natürlich schnuppe ist, kannst du natürlich atoi benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269169</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 19 Apr 2007 11:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 12:13:54 GMT]]></title><description><![CDATA[<p>Der String den ich an atoi/atof verfüttere ist auf jeden Fall eine gültige Zahle, d.h. als einziger Fehler könnte die Zahl außerhalb des Wertebereichs liegen.<br />
Da die Wertebereiche aber für das Dateiformat fest vorgegeben sind, sehe ich da jetzt nicht das Problem.</p>
<p>Was passiert bei atof wenn der String einen double, also eine Zahl enthält die den Wertebereich verlässt? Bzw. gibt es einen Weg einen double in einen float zu verkleinern (auf Kosten der Genauigkeit)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269212</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Thu, 19 Apr 2007 12:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 15:10:58 GMT]]></title><description><![CDATA[<p>Zur Vollständigkeit, weil ich gerade darüber gestolpert bin:<br />
Im Overlaod-Magazin wird eine getunte lexical_cast-Variante vorgestellt, die um einiges schneller sein soll:<br />
<a href="http://www.accu.org/var/uploads/journals/overload74.pdf" rel="nofollow">http://www.accu.org/var/uploads/journals/overload74.pdf</a><br />
Wird wahrscheinlich auch in Boost 1.35 reinkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269341</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 19 Apr 2007 15:10:58 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 15:16:14 GMT]]></title><description><![CDATA[<p>lolz schrieb:</p>
<blockquote>
<p>Allerdings ist boost::lexical_cast viel zu langsam. Laut Profiler wird in boost::lexical_cast knapp 50% der Zeit verbracht.</p>
</blockquote>
<p>Die benutzen dummerweise intern die Streambuffer und haben keine selbst geschriebenen Methoden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269349</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 19 Apr 2007 15:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 15:27:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1463">@Artchi</a>: Wieso erzählst du keinem von dieser Seite? Das Journal gefällt mir ausgesprochen gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269357</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Thu, 19 Apr 2007 15:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Was schnelleres als boost::lexical_cast um Zahlen und Floats zu konvertieren on Thu, 19 Apr 2007 15:35:48 GMT]]></title><description><![CDATA[<p>Hab ich doch: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-179203.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-179203.html</a><br />
Find es auch lesenswert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1269365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1269365</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 19 Apr 2007 15:35:48 GMT</pubDate></item></channel></rss>