You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeutils/kcalc/stats.cpp

197 lines
3.4 KiB

/*
$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;
}