51 lines
1.5 KiB
Text
51 lines
1.5 KiB
Text
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)})
|