diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | Makefile | 24 | ||||
-rw-r--r-- | stddev.cpp | 47 |
3 files changed, 74 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b6649e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +stddev +*.o +*.dSYM diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..733d520 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +CXX = g++ +CXXFLAGS = -Wall -Wextra -std=c++11 -fwrapv +ifneq ($(DEBUG),) + CXXFLAGS += -g +else + CXXFLAGS += -O2 +endif +BIN = stddev + +.PHONY: all clean remake + +all: $(BIN) + +clean: + rm -rf $(BIN) *.o *.dSYM + +remake: clean all + + +$(BIN): $(patsubst %.cpp,%.o,$(wildcard *.cpp)) + $(CXX) -o $@ $^ + +%.o: %.cpp $(wildcard *.h) + $(CXX) $(CXXFLAGS) -c -o $@ $< diff --git a/stddev.cpp b/stddev.cpp new file mode 100644 index 0000000..c804bf3 --- /dev/null +++ b/stddev.cpp @@ -0,0 +1,47 @@ +#include <iostream> +#include <vector> +#include <cmath> + +using namespace std; + +const char *argv0; + +void usage(){ + cerr<<"Usage: "<<argv0<<endl + <<"Prints some statistical information about the data on stdin."<<endl + <<"Data is assumed to be a list of floating-point values."<<endl; +} + +int main(int,char **argv){ + argv0=argv[0]; + + vector<double> data; + + double total=0; + while(true){ + double v; + cin>>v; + if(!cin)break; + data.push_back(v); + total+=v; + } + if(data.size()==0){ + cerr<<"No data"<<endl; + return 0; + } + + sort(data.begin(),data.end()); + + const double s_mean=total/data.size(); + const double s_mode=data[data.size()/2]; + + total=0; + for(double v : data){ + total+=(v-s_mean)*(v-s_mean); + } + const double s_stddev=data.size()==1?nan(""):sqrt(total/(data.size()-1)); + + cout<<"Mean: "<<s_mean<<endl + <<"Stddev: "<<s_stddev<<endl + <<"Mode: "<<s_mode<<endl; +} |