00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00025 class mdp_measure {
00026 public:
00027 int num;
00028 float mean;
00029 float error;
00030 int getnum() { return num; }
00031 float getmean() { return mean; }
00032 float getmerr() { return error; }
00033 mdp_measure() {
00034 num=0;
00035 mean=0;
00036 error=0;
00037 }
00038 mdp_measure(float mean_, float error_, int num_=1) {
00039 num=num_;
00040 mean=mean_;
00041 error=error_;
00042 }
00043 void reset() {
00044 num=0;
00045 mean=0;
00046 error=0;
00047 }
00048 void set(float x, float dx, int i=1) {
00049 num=i;
00050 mean=x;
00051 error=dx;
00052 }
00053 void operator << (float x) {
00054 float err2;
00055 err2=num*(pow((double)error,(double)2.0)+mean*mean)+pow((double)x,(double)2.0);
00056 num++;
00057 mean=(mean*(num-1)+x)/num;
00058 error=sqrt(err2/num-mean*mean);
00059 }
00060 void operator >> (float &x) {
00061 x=mean+error*Random.gaussian();
00062 }
00063 friend mdp_measure operator +(mdp_measure a, mdp_measure b) {
00064 mdp_measure tmp;
00065 tmp.mean =a.mean +b.mean;
00066 tmp.error=a.error+b.error;
00067 tmp.num=1;
00068 return tmp;
00069 }
00070 friend mdp_measure operator -(mdp_measure a, mdp_measure b) {
00071 mdp_measure tmp;
00072 tmp.mean =a.mean -b.mean;
00073 tmp.error=a.error+b.error;
00074 tmp.num=1;
00075 return tmp;
00076 }
00077 friend mdp_measure operator *(mdp_measure a, mdp_measure b) {
00078 mdp_measure tmp;
00079 tmp.mean =a.mean *b.mean;
00080 tmp.error=fabs(a.mean)*b.error+a.error*fabs(b.mean);
00081 tmp.num=1;
00082 return tmp;
00083 }
00084 friend mdp_measure operator /(mdp_measure a, mdp_measure b) {
00085 mdp_measure tmp;
00086 tmp.mean =a.mean/b.mean;
00087 tmp.error=a.error/fabs(b.mean)+
00088 fabs(a.mean)/pow((double)b.mean,(double)2.0)*b.error;
00089 tmp.num=1;
00090 return tmp;
00091 }
00092 friend mdp_measure operator +(float a, mdp_measure b) {
00093 mdp_measure tmp;
00094 tmp.mean =a +b.mean;
00095 tmp.error=b.error;
00096 tmp.num=1;
00097 return tmp;
00098 }
00099 friend mdp_measure operator -(float a, mdp_measure b) {
00100 mdp_measure tmp;
00101 tmp.mean =a-b.mean;
00102 tmp.error=b.error;
00103 tmp.num=1;
00104 return tmp;
00105 }
00106 friend mdp_measure operator *(float a, mdp_measure b) {
00107 mdp_measure tmp;
00108 tmp.mean =a*b.mean;
00109 tmp.error=fabs(a)*b.error;
00110 tmp.num=1;
00111 return tmp;
00112 }
00113 friend mdp_measure operator /(float a, mdp_measure b) {
00114 mdp_measure tmp;
00115 tmp.mean =a/b.mean;
00116 tmp.error=fabs(a)/pow((double)b.mean,(double)2.0)*b.error;
00117 tmp.num=1;
00118 return tmp;
00119 }
00120 friend mdp_measure operator +(mdp_measure a, float b) {
00121 mdp_measure tmp;
00122 tmp.mean =a.mean +b;
00123 tmp.error=a.error;
00124 tmp.num=1;
00125 return tmp;
00126 }
00127 friend mdp_measure operator -(mdp_measure a, float b) {
00128 mdp_measure tmp;
00129 tmp.mean =a.mean -b;
00130 tmp.error=a.error;
00131 tmp.num=1;
00132 return tmp;
00133 }
00134 friend mdp_measure operator *(mdp_measure a, float b) {
00135 mdp_measure tmp;
00136 tmp.mean =a.mean *b;
00137 tmp.error=a.error*fabs(b);
00138 tmp.num=1;
00139 return tmp;
00140 }
00141 friend mdp_measure operator /(mdp_measure a, float b) {
00142 mdp_measure tmp;
00143 tmp.mean =a.mean/b;
00144 tmp.error=a.error/fabs(b);
00145 tmp.num=1;
00146 return tmp;
00147 }
00148 friend mdp_measure exp(mdp_measure a) {
00149 mdp_measure tmp;
00150 tmp.mean=exp(a.mean);
00151 tmp.error=exp(a.mean)*a.error;
00152 tmp.num=1;
00153 return tmp;
00154 }
00155 friend mdp_measure log(mdp_measure a) {
00156 mdp_measure tmp;
00157 tmp.mean=log(a.mean);
00158 tmp.error=a.error/fabs(a.mean);
00159 tmp.num=1;
00160 return tmp;
00161 }
00162 friend mdp_measure pow(mdp_measure a, float b) {
00163 mdp_measure tmp;
00164 tmp.mean=pow((double) a.mean,(double) b);
00165 tmp.error=a.error*b*pow((double) a.mean,(double) b-1);
00166 tmp.num=1;
00167 return tmp;
00168 }
00169 friend mdp_measure sin(mdp_measure a) {
00170 mdp_measure tmp;
00171 tmp.mean=sin(a.mean);
00172 tmp.error=fabs(cos(a.mean))*a.error;
00173 tmp.num=1;
00174 return tmp;
00175 }
00176 friend mdp_measure cos(mdp_measure a) {
00177 mdp_measure tmp;
00178 tmp.mean=cos(a.mean);
00179 tmp.error=fabs(sin(a.mean))*a.error;
00180 tmp.num=1;
00181 return tmp;
00182 }
00183 friend void print(mdp_measure a) {
00184 printf("%f (%f)\n", a.mean, a.error);
00185 }
00186 };