54 lines
1.4 KiB
Plaintext
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))
|