docs: def _choose_float_dtype(dtype, has_offset):
      """Return a float dtype that can losslessly represent `dtype` values."""
      # Keep float32 as-is.  Upcast half-precision to single-precision,
      # because float16 is "intended for storage but not computation"
      if dtype.itemsize <= 4 and np.issubdtype(dtype, np.floating):
          return np.float32
      # float32 can exactly represent all integers up to 24 bits
      if dtype.itemsize <= 2 and np.issubdtype(dtype, np.integer):
          # A scale factor is entirely safe (vanishing into the mantissa),
          # but a large integer offset could lead to loss of precision.
          # Sensitivity analysis can be tricky, so we just use a float64
          # if there's any offset at all - better unoptimised than wrong!
          if not has_offset:
              return np.float32
      # For all other types and circumstances, we just use float64.
      # (safe because eg. complex numbers are not supported in NetCDF)
      return np.float64