code: def combine_uncertainties(op, unc1, unc2, nom1=None, nom2=None, rho=0.):
      
      # operator valid?
      if op in _op_map:
          f = _op_map[op]
      elif op in _op_map_reverse:
          f = op
          op = _op_map_reverse[op]
      else:
          raise ValueError("unknown operator: {}".format(op))
  
      # prepare values for combination, depends on operator
      if op in ("*", "/", "**"):
          if nom1 is None or nom2 is None:
              raise ValueError("operator '{}' requires nominal values".format(op))
          # numpy-safe conversion to float
          nom1 *= 1.
          nom2 *= 1.
          # convert uncertainties to relative values
          unc1 /= nom1
          unc2 /= nom2
          # determine
          nom = abs(f(nom1, nom2))
      else:
          nom = 1.
  
      # combined formula
      if op == "**":
          return nom * abs(nom2) * (unc1**2. + (math.log(nom1) * unc2)**2. + 2 * rho *
              math.log(nom1) * unc1 * unc2)**0.5
      else:
          # flip rho for sub and div
          if op in ("-", "/"):
              rho = -rho
          return nom * (unc1**2. + unc2**2. + 2. * rho * unc1 * unc2)**0.5
docs: Combines two uncertainties *unc1* and *unc2* according to an operator *op* which must be either
      ``"+"``, ``"-"``, ``"*"``, ``"/"``, or ``"**"``. The three latter operators require that you
      also pass the nominal values *nom1* and *nom2*, respectively. The correlation can be configured
      via *rho*.