Numeric error propagation: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Fix Perl 6 -> Raku in comments) |
(add FreeBASIC) |
||
Line 1,027: | Line 1,027: | ||
But with the details of the calculation's progress out of sight. This is probably not a good idea. |
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}}== |
=={{header|Go}}== |