Wednesday 25 January 2017

Ansi C Gleitender Durchschnitt

Itoa mit GCC Wie verwende ich itoa () mit GCC Arrgghh CC Es scheint, dass itoa () nicht ANSI-C-Standard und funktioniert nicht mit GCC auf Linux (zumindest die Version Im mit). Dinge wie diese sind frustrierend, vor allem, wenn Sie möchten, dass Ihr Code auf verschiedenen Plattformen (WindowsLinuxSolariswhatever) zu arbeiten. Viele Leute sagen, dass Sie nur Sprintf zu schreiben, um eine Zeichenfolge, aber das nicht zulassen, für eine der Funktionen von itoa () die Fähigkeit, in einer anderen Basis als 10. Diese Seite enthält eine Reihe von evolvierenden Versionen eines itoa Implementierung. Die ältesten sind in der Nähe der Spitze und die neuesten am unteren Rand. Bitte stellen Sie sicher, dass Sie die neueste Version verwenden. Bevor wir weiter gehen, möchte ich mich bei den Leuten bedanken, die zu den folgenden Lösungen beigetragen haben. Diese Funktion wurde durch Beiträge von Stuart Lowe (das ist mir), Robert Jan Schaper, Ray-Yuan Sheu, Rodrigo de Salvo Braz, Wes Garland, John Maloney, Brian Hunt, Fernando Corradi und Luk225s Chmela zusammengestellt. Entwicklung Hier ist eine frühe Version von Robert Jan Schaper auf Google-Gruppen beschrieben: char Version 0.1 Dies sieht nicht ganz wie die Umsetzung, die ich verwendet, die mehr wie itoa (int Wert, char Puffer, int radix) aussehen. Am Ende habe ich meine eigene Version, die eine std :: string anstelle einer Zeichenfolge verwendet. Std :: String Version 0.1 Update: (20050211) Ray-Yuan Sheu schickte mir eine E-Mail mit einer verbesserten Version, die ein bisschen mehr Fehlerprüfung für Dinge wie eine Basis, die außerhalb des Bereichs und für negative Ganzzahlen ist. Update: (20050408) Rodrigo de Salvo Braz entdeckte einen Fehler, der bedeutete, dass nichts zurückgegeben wurde, als die Eingabe Null war. Es gibt jetzt quot0quot zurück. Dieser Fehler wurde auch von Luc Gallant entdeckt. Std :: string version 0.2 Update: (20050507) Wes Garland sagt, dass lltostr unter Solaris und mehreren anderen Unices existiert. Es sollte eine Zeichenfolge eines langen langen in mehreren Nummernbasen zurückgeben. Es gibt auch ulltostr für unsigned Werte. Update: (20050530) John Maloney hat auf verschiedene Probleme mit der vorherigen Implementierung hingewiesen. Eines der wichtigsten Probleme war die Menge der Haufen Zuteilung geht. Er schlug vor, dass eine Menge davon entfernt werden, um den Algorithmus zu beschleunigen. Unten sind zwei Versionen auf der Grundlage seiner hervorragenden Vorschläge. Die char-Version ist mindestens zehnmal schneller als der obige Code. Die neue std :: string Version ist dreimal schneller als zuvor. Obwohl die char-Version schneller ist, sollten Sie prüfen, ob Sie genügend Speicherplatz für die Ausgabe zur Verfügung haben. Std :: string version 0.3 char version 0.2 Update: (20061015) Luiz Gonlves erzählt mir, dass es zwar kein ANSI-Standard ist, aber itoa in vielen Paketen und in vielen Lehrbüchern steht. Er schlägt eine Version in reinem ANSI C basiert auf einer Version von Kernighan Ritchies Ansi C geschrieben. Ein Basisfehler wird durch die Rückgabe eines leeren Strings gemeldet, aber die Funktion führt keine Kontrollen von Größen und keine Zuweisungen durch. Diese Version wird unten zusammen mit einer etwas modifizierten Version (Architektur spezifische Tweaks), die std :: string Version und die C char itoa () Version zur Verfügung gestellt. Update: (20090708) Im vergangenen Jahr Ive hatte ein paar Vorschläge für Verbesserungen sowohl die std :: string und char Versionen des Codes. Ive hatte endlich Zeit, sie zu testen. In der Version std :: string schlug Brian Hunt vor, die Reserve nach der Basiskontrolle zu verschieben, um Speicherzuweisungen zu speichern. Dies beschleunigt die Dinge ein wenig. Std :: string version 0.4 Es gab auch mehrere Vorschläge für Verbesserungen der char-Version des Codes. Fernando Corradi schlug vor, das abs () zu bewegen, so dass es nur einmal verwendet wird und nicht mit dem Modulus-Operator (), sondern berechnen es von Hand, die eine Teilung speichert. Luk225s Chmela hat den Code neu geschrieben, so dass es nicht die meisten negativen Zahlen Fehler: char Version 0.4 Neueste Versionen Im Folgenden sind die neuesten Versionen der itoa-Funktion mit entweder char oder Std :: string, wie Sie es vorziehen. Ich havent enthalten die Kernighan Ritchie basierte Versionen in diesem Abschnitt, weil Im nicht sicher, was der Copyright-Status für diejenigen ist. Die unten aufgeführten Funktionen wurden von den auf dieser Seite erwähnten Personen entwickelt und stehen zur Verfügung. Std :: string Version 0.4 char Version 0.4 Performance-Vergleich Ive getan einige Tests der Versionen von itoa durch die Suche nach der durchschnittlichen Zeit für die Durchführung von Conversions, der ganzen Zahlen im Bereich von -32768 bis 32767, in jeder Basis von Basis 2 bis Base 20 (Der Code funktioniert nur bis Base 16 so die zusätzlichen Basen sind nur da als Tests). Die Zusammenfassung ist in der folgenden Tabelle dargestellt: Ich weiß, dies ist erreichbar mit Boost wie pro: Aber ich möchte wirklich vermeiden, mit Boost. Ich habe gegoogelt und keine geeigneten oder lesbaren Beispiele gefunden. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms mit den letzten 1000 Zahlen als Datenprobe verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array meine Bedürfnisse am besten geeignet. Wenn Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie eine Akkumulator-Variable, und wie Ihr Code sieht auf jede Probe, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer gegebenen Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, gibt es ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung. Aber, wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, dieses ist eine sehr einfache und schnelle Weise, es zu tun. Beantwortet Jun 12 12 at 4:44 1 auf Ihrem Beitrag. Der exponentielle gleitende Durchschnitt kann zulassen, dass das Alpha variabel ist. Somit kann dies dazu verwendet werden, Zeitbasisdurchschnitte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie Alpha 1.0 sein. Andernfalls können Sie Alpha zulassen (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahls mit den neuesten 1000 Zahlen als Datenbeispiel zu verfolgen. Beachten Sie, dass im Folgenden die Summe als Elemente als addiert ergänzt wird, wobei kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf benötigt wird. Insgesamt wird ein anderer Parameter von T gebildet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lange s, eine int für char s, oder eine doppelte bis total float s. Dies ist ein wenig fehlerhaft, dass Nennsignale an INTMAX vorbeiziehen könnten - wenn Sie darauf achten, dass Sie ein langes langes nicht signiertes verwenden konnten. Oder verwenden Sie ein zusätzliches Bool-Datenelement, um aufzuzeichnen, wenn der Container zuerst gefüllt wird, während numsamples rund um das Array (am besten dann umbenannt etwas harmlos wie pos). Man nehme an, daß der quadratische Operator (T-Abtastwert) tatsächlich quadratischer Operator (T-Abtastwert) ist. Ndash oPless Jun 8 14 um 11:52 Uhr oPless ahhh. Gut beobachtet. Eigentlich meinte ich, dass es sich um void operator () (T sample) handelt, aber natürlich könntet ihr auch irgendeine Notation verwenden, die ihr mochtet. Wird beheben, danke. Ndash Tony D Jun 14 14 am 14:27


No comments:

Post a Comment