with javascript_semantics enum VALUE, DELTA type imprecise(object imp) return sequence(imp) and atom(imp[VALUE]) and atom(imp[DELTA]) end type function sqr(atom a) return a*a end function function imprecise_add(imprecise a, b) atom delta = sqrt(sqr(a[DELTA]) + sqr(b[DELTA])) imprecise ret = {a[VALUE] + b[VALUE], delta} return ret end function function imprecise_mul(imprecise a, b) atom delta = sqrt(sqr(a[VALUE]*b[DELTA]) + sqr(b[VALUE]*a[DELTA])) imprecise ret = {a[VALUE] * b[VALUE],delta} return ret end function function imprecise_div(imprecise a, b) atom delta = sqrt(sqr(a[VALUE]*b[DELTA]) + sqr(b[VALUE]*a[DELTA]))/sqr(b[VALUE]) imprecise ret = {a[VALUE] / b[VALUE], delta} return ret end function function imprecise_pow(imprecise a, atom c) atom v = power(a[VALUE], c), delta = abs(v*c*a[DELTA]/a[VALUE]) imprecise ret = {v,delta} return ret end function function imprecise_str(imprecise imp) return sprintf("%g+/-%g",imp) end function imprecise x1 = {100, 1.1}, y1 = {50, 1.2}, x2 = {-200, 2.2}, y2 = {-100, 2.3}, tmp1 = imprecise_pow(imprecise_add(x1, x2), 2), tmp2 = imprecise_pow(imprecise_add(y1, y2), 2), d = imprecise_pow(imprecise_add(tmp1,tmp2), 0.5) printf(1,"Distance, d, between the following points :\n") printf(1," (x1, y1) = (%s, %s)\n",{imprecise_str(x1),imprecise_str(y1)}) printf(1," (x2, y2) = (%s, %s)\n",{imprecise_str(x2),imprecise_str(y2)}) printf(1," is d = %s\n", {imprecise_str(d)})