/**
   * Computes x + y without losing precision using ln(x) and ln(y).
   *
   * @param lna Value.
   * @param lnc Value.
   * @return Result.
   */
  public static double LogSum(float lna, float lnc) {
    if (lna == Float.NEGATIVE_INFINITY) return lnc;
    if (lnc == Float.NEGATIVE_INFINITY) return lna;

    if (lna > lnc) return lna + Special.Log1p(Math.exp(lnc - lna));

    return lnc + Special.Log1p(Math.exp(lna - lnc));
  }