Jump to content

Numeric error propagation: Difference between revisions

Line 537:
 
procedure add(a,b)
ifreturn (numeric(a) & +numeric(b)) then return a+b|
if numeric(a) then return num(numeric(a)+b.val, b.err) |
if numeric(b) then return num(a.val+numeric(b), a.err) |
return num(a.val+b.val, (a.err^2 + b.err^2) ^ 0.5)
end
 
procedure sub(a,b)
ifreturn (numeric(a) & -numeric(b)) then return a-b|
if numeric(a) then return num(numeric(a)-b.val, b.err) |
if numeric(b) then return num(a.val-numeric(b), a.err) |
return num(a.val-b.val, (a.err^2 + b.err^2) ^ 0.5)
end
 
procedure mul(a,b)
ifreturn (numeric(a) & *numeric(b)) then return a*b|
if numeric(a) then return num(numeric(a)*b.val, abs(a*b.err)) |
if numeric(b) then return num(a.val*numeric(b), abs(b*a.err)) |
return num(f := a.val*b.val, ((f^2*((a.err/a.val)^2+(b.err/b.val)^2))^0.5))
end
 
procedure div(a,b)
ifreturn (numeric(a) & /numeric(b)) then return a/b|
if numeric(a) then return num(numeric(a)/b.val, abs(a*b.err)) |
if numeric(b) then return num(a.val/numeric(b), abs(b*a.err)) |
return num(f := a.val/b.val, ((f^2*((a.err/a.val)^2+(b.err/b.val)^2))^0.5))
end
 
procedure pow(a,b)
ifreturn (numeric(a) & ^numeric(b)) then return a^b|
if numeric(b) then return num(f := a.val^numeric(b), abs(f*b*(a.err/a.val)))
fail
end
end</lang>
 
The output is:
Cookies help us deliver our services. By using our services, you agree to our use of cookies.