?
Dies Codes die du geschrieben hast, sollten gar nicht kompilliert werden, aber da sie es scheinbar dennoch tun, nehme ich an, du hast nur falsch abgeschrieben.
Der Gebrauch des double s rührt von einer Integer Division her, das Problem hast du auch in Java. accumulate kannst du ruhig auch ohne double ausführen (es gibt dir die korrekte Summe als int zurück), nur wenn du durch size (ebenfalls int ) dividierst, kommt eben eine Ganzzahl heraus.
Entweder kannst du size als double deklarieren oder eben für die Summe die einzelnen Werte als double ansehen. Das geht, indem du die 0' [int] als \0' [double] angibst und dem Compiler das mithilfe eines Punktes mitteilst. Ich mag ` 0. ', wie von padreigh vorgeschlagen, nicht so arg, weil man den Punkt so leicht übersieht. 0.0', genau das, was ich schon vorher geschrieben habe ist ebenfalls eine äquivalente Darstellung von (double)0 ' oder static_cast<double>(0)` '.
Für einen Anfänger, wie du es bist, empfehle ich trotz allem, dir diese Funktionalität auszulagern:
template<typename TRes, typename T>
TRes calc_mean(const T *values, int size)
{
return std::accumulate(values, values+size-1, TRes(0))/(size-1);
}
template<typename TRes, typename T>
TRes calc_deviation(const T *values, int size)
{
return std::sqrt(inner_product(values, values+size-1, values, TRes(0))/(size-1);
}
// Gebrauch:
double mean = calc_mean<double>(iA, size);
So wird das für dich eventuell etwas vereinfacht.