///|
/// logaddexp(x1, x2) = log(exp(x1) + exp(x2))
pub fn logaddexp(x1 : Double, x2 : Double) -> Double {
  if !isfinite(x1) {
    return x1
  } else if !isfinite(x2) {
    return x2
  }
  let temp : Double = x1 - x2
  if temp > 0 {
    x1 + log1p(exp(-temp))
  } else {
    x2 + log1p(exp(temp))
  }
}