summaryrefslogtreecommitdiffstats
path: root/kcalc/stats.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit2bda8f7717adf28da4af0d34fb82f63d2868c31d (patch)
tree8d927b7b47a90c4adb646482a52613f58acd6f8c /kcalc/stats.cpp
downloadtdeutils-2bda8f7717adf28da4af0d34fb82f63d2868c31d.tar.gz
tdeutils-2bda8f7717adf28da4af0d34fb82f63d2868c31d.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeutils@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kcalc/stats.cpp')
-rw-r--r--kcalc/stats.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/kcalc/stats.cpp b/kcalc/stats.cpp
new file mode 100644
index 0000000..909bed6
--- /dev/null
+++ b/kcalc/stats.cpp
@@ -0,0 +1,196 @@
+/*
+ $Id$
+
+ KCalc, a scientific calculator for the X window system using the
+ Qt widget libraries, available at no cost at http://www.troll.no
+
+ Copyright (C) 1996 Bernd Johannes Wuebben
+ wuebben@math.cornell.edu
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+
+#include "stats.h"
+#ifdef DEBUG_STATS
+ #include <stdio.h>
+#endif
+
+KStats::KStats() {
+ error_flag = false;
+}
+
+KStats::~KStats() {
+}
+
+void KStats::clearAll() {
+ mData.clear();
+}
+
+void KStats::enterData(KNumber const & _data) {
+
+ mData.push_back(_data);
+#ifdef DEBUG_STATS
+ printf("Added %Lg\n", _data);
+ printf("count %d\n", mData.size());
+#endif
+
+}
+
+
+void KStats::clearLast(void) {
+
+ mData.pop_back();
+#ifdef DEBUG_STATS
+ printf("count %d\n",mData.size());
+#endif
+
+
+}
+
+KNumber KStats::sum(void) {
+
+ KNumber result = 0;
+ QValueVector<KNumber>::iterator p;
+
+ for(p = mData.begin(); p != mData.end(); ++p) {
+ result += *p;
+ }
+
+#ifdef DEBUG_STATS
+ printf("Sum %Lg\n", result);
+#endif
+
+ return result;
+}
+
+KNumber KStats::median(void) {
+
+ KNumber result = 0;
+ unsigned int bound;
+ size_t index;
+
+ bound = count();
+
+ if (bound == 0){
+ error_flag = true;
+ return 0;
+ }
+
+ if (bound == 1)
+ return mData.at(0);
+
+ // need to copy mData-list, because sorting afterwards
+ QValueVector<KNumber> tmp_mData(mData);
+ qHeapSort(tmp_mData);
+
+ if( bound & 1) { // odd
+ index = (bound - 1 ) / 2 + 1;
+ result = tmp_mData.at(index - 1);
+ } else { // even
+ index = bound / 2;
+ result = ((tmp_mData.at(index - 1)) + (tmp_mData.at(index))) / KNumber(2);
+ }
+
+ return result;
+}
+
+
+KNumber KStats::std_kernel(void)
+{
+ KNumber result = KNumber::Zero;
+ KNumber _mean;
+ QValueVector<KNumber>::iterator p;
+
+ _mean = mean();
+
+ for(p = mData.begin(); p != mData.end(); ++p) {
+ result += (*p - _mean) * (*p - _mean);
+ }
+
+ return result;
+}
+
+
+KNumber KStats::sum_of_squares() {
+
+ KNumber result = 0;
+ QValueVector<KNumber>::iterator p;
+
+ for(p = mData.begin(); p != mData.end(); ++p) {
+ result += ((*p) * (*p));
+ }
+
+ return result;
+}
+
+
+KNumber KStats::mean(void)
+{
+ if(count() == 0){
+ error_flag = true;
+ return 0;
+ }
+
+ return (sum() / KNumber(count()));
+}
+
+
+KNumber KStats::std(void)
+{
+ if(count() == 0){
+ error_flag = true;
+ return KNumber::Zero;
+ }
+
+ return (std_kernel() / KNumber(count())).sqrt();
+}
+
+
+KNumber KStats::sample_std(void) {
+ KNumber result = 0;
+
+ if(count() < 2 ){
+ error_flag = true;
+ return KNumber::Zero;
+ }
+
+ result = (std_kernel() / KNumber(count() - 1)).sqrt();
+
+ // result = result/(count() - 1);
+#ifdef DEBUG_STATS
+ printf("sample std: %Lg\n",result);
+#endif
+
+ return result;
+}
+
+
+int KStats::count(void) const
+{
+ return static_cast<int>(mData.size());
+}
+
+
+bool KStats::error() {
+
+ bool value = error_flag;
+ error_flag = false;
+ return value;
+}
+
+
+