Numeric error propagation: Difference between revisions

add FreeBASIC
m (Fix Perl 6 -> Raku in comments)
(add FreeBASIC)
Line 1,027:
 
But with the details of the calculation's progress out of sight. This is probably not a good idea.
 
=={{header|FreeBASIC}}==
<lang freebasic>'----------------------
' 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 )</lang>
{{out}}<pre>
111.80340 +- 2.4872
</pre>
 
=={{header|Go}}==
781

edits