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)