Numeric error propagation: Difference between revisions

Line 1,347:
{{Out}}
<pre>111.803 ± 2.48717</pre>
=={{header|Nim}}==
<lang Nim>import strformat
import math
 
type
Imprecise = object
x: float
σ: float
 
template `^`(a, b: float): float =
pow(a, b)
template `-`(a: Imprecise): Imprecise =
Imprecise(x: -a.x, σ: a.σ)
template `+`(a, b: Imprecise): Imprecise =
Imprecise(x: a.x + b.x, σ: sqrt(a.σ ^ 2 + b.σ ^ 2))
template `-`(a, b: Imprecise): Imprecise =
Imprecise(x: a.x - b.x, σ: sqrt(a.σ ^ 2 + b.σ ^ 2))
template `*`(a, b: Imprecise): Imprecise =
let x = a.x * b.x
let σ = sqrt(x ^ 2 * ((a.σ / a.x) ^ 2 + (b.σ / b.x) ^ 2))
Imprecise(x: x, σ: σ)
template `/`(a, b: Imprecise): Imprecise =
let x = a.x / b.x
let σ = sqrt(x ^ 2 * ((a.σ / a.x) ^ 2 + (b.σ / b.x) ^ 2))
Imprecise(x: x, σ: σ)
template `^`(a: Imprecise, b: float): Imprecise =
if b < 0:
raise newException(IOError, "Cannot raise to negative power.")
let x = a.x ^ b
let σ = abs(x * b * a.σ / a.x)
Imprecise(x: x, σ: σ)
template sqrt(a: Imprecise): Imprecise =
a ^ 0.5
 
proc `$`(a: Imprecise): string =
fmt"{a.x:.2f} ± {a.σ:.2f}"
 
var x1 = Imprecise(x: 100, σ: 1.1)
var y1 = Imprecise(x: 50, σ: 1.2)
var x2 = Imprecise(x: 200, σ: 2.2)
var y2 = Imprecise(x: 100, σ: 2.3)
 
echo $(sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2))</lang>
{{out}}
<pre>
111.80 ± 2.49
</pre>
 
=={{header|PARI/GP}}==
''This is a work-in-progress.''
Anonymous user