61 lines
2 KiB
Text
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)
|