findet jemand den Fehler?
-
#include <algorithm> #include <iomanip> #include <iostream> #include <istream> #include <iterator> #include <numeric> #include <ostream> #include <vector> int main() { std::vector<int> v; std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(v)); int avg = std::accumulate(v.begin(), v.end(), 0) / v.size(); std::cout << avg << std::endl; }Das Programm soll den Mittelwert der eingegebenen Werte liefern. In den meisten Faellen funktioniert es, aber manchmal wird ein falsches Ergebnis geliefert. Weis jemand wieso?
-
Vermutlich ein Rundungsfehler durch "int avg" ?
Bei Division würde ich jedenfalls float oder double nehmen...
-
Du dividierst nur integrale Zahlenwerte, d.h. der Nachkommaanteil wird ignoriert. Caste mal v.size() in einen double und mach aus avg auch einen double.
-
Tyrdal schrieb:
Du dividierst nur integrale Zahlenwerte, d.h. der Nachkommaanteil wird ignoriert. Caste mal v.size() in einen double und mach aus avg auch einen double.
Vielleicht haette ich sagen sollen "Mittelwert ohne Nachkomma".
Nein, das ist nicht der Fehler. Tipp: Der Fehler tritt auf, wenn std::accumulate() eine negative Summe zurueckliefert. Dann koennte es passieren, dass der Mittelwert ganz und gar falsch ist.
-
int avg = std::accumulate(v.begin(), v.end(), 0) / static_cast<int>(v.size());
-
if( !v.empty()) { int avg = std::accumulate(v.begin(), v.end(), 0) / static_cast<int>(v.size()); // weiter }
-
bei den hier genannten Lösungen musst du aber dann noch aufpassen, dass v.size() einen bestimmten Wert nicht überschreitet(2^31? nicht ganz sicher), denn int nutzt das höchstwertigste bit als vorzeichenbit.
-
So schnell wird er den std::vector wohl nicht mit 2 Milliarden Werten füllen können, denn das wären dann ja schon 8 GB Hauptspeicher...