'---------------------- ' definition of a "measurement" type with value and uncartainty ' and operators that can operate on them '--------------------- #macro p2(x) (x)*(x) #endmacro type meas vlu as double unc as double end type operator + ( a as meas, b as meas ) as meas dim ret as meas ret.vlu = a.vlu + b.vlu ret.unc = sqr( a.unc*a.unc + b.unc*b.unc ) return ret end operator operator + ( c as double, a as meas ) as meas dim ret as meas ret.vlu = a.vlu + c ret.unc = a.unc return ret end operator operator + ( a as meas, c as double ) as meas return c+a end operator operator - ( a as meas, b as meas ) as meas dim ret as meas ret.vlu = a.vlu - b.vlu ret.unc = sqr( a.unc*a.unc + b.unc*b.unc ) return ret end operator operator - ( c as double, a as meas ) as meas dim ret as meas ret.vlu = a.vlu - c ret.unc = a.unc return ret end operator operator - ( a as meas, c as double ) as meas dim ret as meas ret.vlu = c - a.vlu ret.unc = a.unc return ret end operator operator * ( a as meas, b as meas ) as meas dim ret as meas ret.vlu = a.vlu*b.vlu ret.unc = sqr(p2(ret.vlu) * (p2(a.unc/a.vlu)+p2(b.unc/b.vlu))) return ret end operator operator * ( c as double, a as meas ) as meas dim ret as meas ret.vlu = a.vlu*c ret.unc = abs(c*a.unc) return ret end operator operator * ( a as meas, c as double ) as meas return c*a end operator operator ^ ( a as meas, c as double ) as meas dim ret as meas ret.vlu = a.vlu ^ c ret.unc = abs(ret.vlu*c*a.unc/a.vlu) return ret end operator operator / ( c as double, a as meas ) as meas return c*a^(-1) end operator operator / ( a as meas, c as double ) as meas return a*(1.0/c) end operator operator / ( a as meas, b as meas ) as meas return b*a^(-1) end operator sub printm( a as meas ) print using "####.##### +- ####.####"; a.vlu; a.unc end sub '-------------------------------- ' now the results '-------------------------------- dim as meas x1, y1, x2, y2 x1.vlu = 100. x1.unc = 1.1 y1.vlu = 50. y1.unc = 1.2 x2.vlu = 200. x2.unc = 2.2 y2.vlu = 100. y2.unc = 2.3 printm( ((x1-x2)^2 + (y1-y2)^2)^0.5 )