RosettaCodeData/Task/Numeric-error-propagation/Pluto/numeric-error-propagation.pluto
2026-04-30 12:34:36 -04:00

61 lines
2 KiB
Text

class approx
static function from(a)
if a instanceof approx then return new approx(a.nu, a.sigma) end
if type(a) == "number" then return new approx(a, 0) end
end
function __construct(public nu, public sigma) end
function __add(a)
if a instanceof approx then
local sr = math.sqrt(self.sigma * self.sigma + a.sigma * a.sigma)
return new approx(self.nu + a.nu, sr)
end
if type(a) == "number" then return new approx(self.nu + a, self.sigma) end
end
function __sub(a)
if a instanceof approx then
local sr = math.sqrt(self.sigma * self.sigma + a.sigma * a.sigma)
return new approx(self.nu - a.nu, sr)
end
if type(a) == "number" then return new approx(self.nu - a, self.sigma) end
end
function __mul(a)
if a instanceof approx then
local v = self.nu * a.nu
local sq = v * v * self.sigma * self.sigma / (self.nu * self.nu)
sq += a.sigma * a.sigma / (a.nu * a.nu)
return new approx(v, math.sqrt(sq))
end
if type(a) == "number" then
return new approx(self.nu * a, math.abs(a * self.sigma))
end
end
function __div(a)
if a instanceof approx then
local v = self.nu / a.nu
local sq = v * v * self.sigma * self.sigma / (self.nu * self.nu)
sq += a.sigma * a.sigma / (a.nu * a.nu)
return new approx(v, math.sqrt(sq))
end
if type(a) == "number" then
return new approx(self.nu / a, math.abs(a * self.sigma))
end
end
function __pow(d)
local v = self.nu ^ d
return new approx(v, math.abs(v * d * self.sigma / self.nu))
end
function __tostring() return $"{self.nu} ±{self.sigma}" end
end
local x1 = new approx(100, 1.1)
local y1 = new approx( 50, 1.2)
local x2 = new approx(200, 2.2)
local y2 = new approx(100, 2.3)
print(((x1 - x2) ^ 2 + (y1 - y2) ^ 2) ^ 0.5)