RosettaCodeData/Task/Numeric-error-propagation/Wren/numeric-error-propagation.wren

54 lines
1.4 KiB
Plaintext

class Approx {
construct new(nu, sigma) {
_nu = nu
_sigma = sigma
}
static new(a) {
if (a is Approx) return Approx.new(a.nu, a.sigma)
if (a is Num) return Approx.new(a, 0)
}
nu { _nu }
sigma { _sigma }
+(a) {
if (a is Approx) return Approx.new(_nu + a.nu, (_sigma *_sigma + a.sigma*a.sigma).sqrt)
if (a is Num) return Approx.new(_nu + a, _sigma)
}
-(a) {
if (a is Approx) return Approx.new(_nu - a.nu, (_sigma *_sigma + a.sigma*a.sigma).sqrt)
if (a is Num) return Approx.new(_nu - a, _sigma)
}
*(a) {
if (a is Approx) {
var v = _nu * a.nu
return Approx.new(v, (v*v*_sigma*_sigma/(_nu*_nu) + a.sigma*a.sigma/(a.nu*a.nu)).sqrt)
}
if (a is Num) return Approx.new(_nu*a, (a*_sigma).abs)
}
/(a) {
if (a is Approx) {
var v = _nu / a.nu
return Approx.new(v, (v*v*_sigma*_sigma/(_nu*_nu) + a.sigma*a.sigma/(a.nu*a.nu)).sqrt)
}
if (a is Num) return Approx.new(_nu/a, (a*_sigma).abs)
}
pow(d) {
var v = _nu.pow(d)
return Approx.new(v, (v*d*_sigma/_nu).abs)
}
toString { "%(_nu) ±%(_sigma)" }
}
var x1 = Approx.new(100, 1.1)
var y1 = Approx.new( 50, 1.2)
var x2 = Approx.new(200, 2.2)
var y2 = Approx.new(100, 2.3)
System.print(((x1 - x2).pow(2) + (y1 - y2).pow(2)).pow(0.5))