Anfängerfrage - Erweiterung von math
-
Hallo,
ich habe bisher meine Probleme mit VBA lösen können. Nun steh ich aber vor dem Problem, dass VBA für mein aktuelles Projekt einfach zu langsam ist. Deswegen beschäftige ich mich sei ein paar Tagen mit c++.Für meine Berechnungen benötige ich diverse mathematische Funktionen wie nat. Logarithmus, Mittelwert, Standardabweichung etc. Ersterer ist in math enthalten. Für die beiden anderen habe ich schon viele Beiträge hier im Forum und im Internet gefunden.
Warum wird die math denn nicht um solche mathematischen Standardformeln erweitert?
/Andi
-
Eventuell weil es nicht notwendig ist.
-
Dafür gibt es genügend andere Libraries.
-
Dafür gibts die STL (Standard Template Library, gehört zum C++ Standard):
std::vector<int> values; int mean = std::accumulate(values.begin(), values.end(), 0); int deviation = std::sqrt(inner_product(values.begin(), values.end(), values.begin(), 0.0)/(values.size()-1));Da wird keine andere Bibliothek benötigt.
-
vielen Dank stl! Klar wenn's die schon gibt dann ist neu oder anfügen an eine ander Bibliothek natürlich sinnlos

/Andi
-
also der Umstieg von VBA auf c++ ist schwieriger als erwartet. Darf ich nochmal eine (Anfänger)frage stellen?
Ich habe gestern versucht den Mittelwert mit accumulate zu rechnen und da ich Fließkommazahlen habe sah mein Code so aus:
int size = sizeof(iA[0])/sizeof(iA[0][0]); double mean = accumulate(iA[0], iA[]+size, 0)/size;iA ist einzweidimensionales Array. Aber das Ergebnis war immer eine Ganzahl. Irgendwann habe ich im Internet folgenden Code gefunden:
double mean = accumulate(iA[0], iA[]+size, (double)0)/size;Und so funktioniert es auch. Aber woher soll ein Anänger wissen dass irgendwo im Code ein double hinein muss?
/Andi
-
versuch doch mal statt (A)
double(0)oder (B)(double)0lieber (C)0.<<-- dann sieht der das du Kommazahlen nutzt und brauchst weder eine initialisierte doublezahl (A) noch ein bösen c-style-cast (B) dafür.
-
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
doubles rührt von einer Integer Division her, das Problem hast du auch in Java.accumulatekannst du ruhig auch ohne double ausführen (es gibt dir die korrekte Summe alsintzurück), nur wenn du durch size (ebenfallsint) dividierst, kommt eben eine Ganzzahl heraus.
Entweder kannst dusizealsdoubledeklarieren oder eben für die Summe die einzelnen Werte alsdoubleansehen. Das geht, indem du die0' [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' oderstatic_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.