Holen Sie sich den durchschnittlichen Wert aus einem Vektor von Integer-zahlen
Habe ich nicht in der Lage war einen Weg zu finden, immer der Durchschnittliche Wert aus einem Vektor von Integer-zahlen in C++.
Kann ich vielleicht beginnen Sie mit dem einfügen alle Werte, da könnte ich mehr als die maximale integer-Wert angenommen.
Wie kann ich berechnen, diese effizient und schnell ? Gibt es irgendwelche standard-Bibliotheken in der Sprache C++ zu tun ?
- Könnten Sie die Akkumulation in einem
double
. Da die Durchschnittliche ganzer zahlen muss keine ganze Zahl, es scheint, Sie gehen zu müssen, um floating-point sowieso. - Dann nicht sich zu eine
int
(verwenden Sie eineuint64_t
statt, zum Beispiel). - Ich habe einen richtig großen Vektor von 23 Mio zahlen, ich denke nicht, dass dieser Weg funktionieren würde. Gibt es nicht eine Möglichkeit, dies zu tun, andere als manuell ?
- Hängt davon ab, wie viele es sind -, wenn die Summe geht über 2^53, dann
double
führen zu ungenauen Ergebnissen. (Limit füruint64_t
ist 2^64.) - 23 Mio € ist wesentlich weniger als 2^64 / 2^32.
- Was ist falsch mit
std::accumulate( vector.begin(), vector.end(), 0.0) / vector.size();
- Könnten Sie
int64_t
wenn der Vektor verfügt über 32-bit-Ganzzahlen. Wenn Sie 64-bit-Ganzzahlen, die Sie nutzen könnten__int128_t
oder gleichwertig (vorausgesetzt, Ihr compiler bietet es). - Gemeinsame Jungs, wenn Sie zu tun haben durchschnittlich 1Mio zahlen, Veranstaltung mit langen (oder eher gesagt lange lange), er wird überlaufen. Und mit verdoppelt würde, er einen schrecklichen Verlust der Genauigkeit im Durchschnitt. Er muss wirklich etwas mehr...
- 1 million wird nicht überlaufen (vorausgesetzt, wir meinen
int
durch "integer"). - wäre er fügt 1 million von Ganzzahlen, die jeweils um MAX_INT/2 er wird sicherlich überlaufen...
- Nicht, wenn akkumulieren in einer 64-bit-Typ (vorausgesetzt, die ursprünglichen Vektor enthält 32-bit-Werte).
- 23 Millionen * int32_max passt problemlos in eine 64-bit-integer. Solange Sie nicht mehr als 4 Milliarden int (2^32 um genau zu sein) in den Vektor, der sich in eine
int64_t
wird gut tun. - Sie können auf jeden Fall tun, dass mit einer einfachen Formel so lange, wie Sie wissen, zählen der Elemente. Angenommen, ein Vektor ist eine. So Formel sein wird. S+= a[i]/n
Du musst angemeldet sein, um einen Kommentar abzugeben.
Go-Ansatz ist nur Summierung mit einem ausreichend breiten integer-Typ mit
std::accumulate
:Wenn diese Summe überläufe (mit 23 Millionen int-Werte, der Durchschnitt müsste mindestens 4.01x1011, das heißt, es wird nicht überlaufen da, die gar nicht passen in einem
int32_t
... also du bist so gut, aber auf der off-chance, die Sie bekommen ein Vielfaches mehr zahlen, oder haben eine breitereint
- Typ), dann Sie können stattdessen die üblichen "online" - Algorithmus für die Berechnung der Mittelwerte:Diese nicht überlaufen, ist nicht sehr anfällig für den Verlust von Genauigkeit, aber möglicherweise teurer, da Sie wiederholt extra Abteilungen.
T init
. Mit Doppel-16-17 Ziffern; und 32-bit-int-10-Ziffern. 64-bit-int über 20 stellen.1
(könnte auch kommen mit Beispiele, die erfordern, dass Weise weniger Einträge...)Viele Diskussionen finden, eine Summe, die vielleicht zu groß sogar für einen uint64_t.
So Folgen Sie diesen Vorschlag und aufhören, sich sorgen ...
Habe ich genutzt, kann es empfehlen und bin sehr zufrieden mit der multi-precision C++ Bibliothek namens "gmpxx.h".
Ich benutzte es für mehrere interessant Bemühungen, einschließlich code zu generieren, eine große fibonacci-ohne erkennbare Anstrengung. Es ist einfach zu bedienen und überraschend schnell, und ich habe auf dem web-Beispiele für die Verwendung.
Code-snippet:
Meine Ausgabe ist eine 2568-Zeichen (>1900-stellig), durch Komma getrennte, große int-Wert in < 20 ms.
2568 bytes
real 0m0.013s
user 0m0.004s
sys 0m0.000s
Also wie groß ist ein uint64_t? Ich denke, die größte Lüge, die passt in uint64_t ist Fib(93).