protected double lnXpluslnY(double lnX,double lnY){
  double lnYminusLnX, temp;
  if (lnY > lnX) {
    temp=lnX;
    lnX=lnY;
    lnY=temp;
  }
  lnYminusLnX=lnY - lnX;
  if (lnYminusLnX < MININUM_EXPONENT) {
    return lnX;
  }
 else {
    return Math.log1p(Math.exp(lnYminusLnX)) + lnX;
  }
}

protected double lnXpluslnY ( double lnX , double lnY ) { double lnYminusLnX , temp ; if ( lnY > lnX ) { temp = lnX ; lnX = lnY ; lnY = temp ; } lnYminusLnX = lnY - lnX ; if ( lnYminusLnX < MININUM_EXPONENT ) { return lnX ; } else { return Math . log1p ( Math . exp ( lnYminusLnX ) ) + lnX ; } }
takes ln ( x ) and ln ( y ) as input , and returns ln ( x + y )
