summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--Makefile24
-rw-r--r--stddev.cpp47
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;
+}