docs: def split_value(val):
      """
      Splits a value *val* into its significand and decimal exponent (magnitude) and returns them in a
      2-tuple. *val* might also be a numpy array. Example:
  
      .. code-block:: python
  
          split_value(1)     # -> (1.0, 0)
          split_value(0.123) # -> (1.23, -1)
          split_value(-42.5) # -> (-4.25, 1)
  
          a = np.array([1, 0.123, -42.5])
          split_value(a) # -> ([1., 1.23, -4.25], [0, -1, 1])
  
      The significand will be a float while magnitude will be an integer. *val* can be reconstructed
      via ``significand * 10**magnitude``.
      """
      val = ensure_nominal(val)
  
      if not is_numpy(val):
          # handle 0 separately
          if val == 0:
              return (0., 0)
  
          mag = int(math.floor(math.log10(abs(val))))
          sig = float(val) / (10.**mag)
  
      else:
          log = np.zeros(val.shape)
          np.log10(np.abs(val), out=log, where=(val != 0))
          mag = np.floor(log).astype(np.int)
          sig = val.astype(np.float) / (10.**mag)
  
      return (sig, mag)