43 lines
1.2 KiB
Nim
43 lines
1.2 KiB
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))
|