Java examples for java.lang:Math Algorithm
Get the log( exp( logX ) - exp( logY ) ).
/** Basic numeric operations not included in standard Java run-time library. * * <p>// ww w . j a va2 s . co m * The binomial methods are modified from those in the Colt library. * </p> * * <p> * The following methods for trigonometric functions come from the * Sfun class written by Visual Numerics. * </p> * * <ul> * <li>acosh</li> * <li>asinh</li> * <li>atanh</li> * <li>cot</li> * <li>cosh</li> * <li>sinh</li> * <li>tanh</li> * </ul> * * <p> * These methods are covered by the following license. * </p> * * ------------------------------------------------------------------------- * $Id: Sfun.java,v 1.1.1.1 1999/03/05 21:43:39 brophy Exp $ * ------------------------------------------------------------------------- * Copyright (c) 1997 - 1998 by Visual Numerics, Inc. All rights reserved. * * Permission to use, copy, modify, and distribute this software is freely * granted by Visual Numerics, Inc., provided that the copyright notice * above and the following warranty disclaimer are preserved in human * readable form. * * Because this software is licensed free of charge, it is provided * "AS IS", with NO WARRANTY. TO THE EXTENT PERMITTED BY LAW, VNI * DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO ITS PERFORMANCE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * VNI WILL NOT BE LIABLE FOR ANY DAMAGES WHATSOEVER ARISING OUT OF THE USE * OF OR INABILITY TO USE THIS SOFTWARE, INCLUDING BUT NOT LIMITED TO DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, PUNITIVE, AND EXEMPLARY DAMAGES, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * ------------------------------------------------------------------------- */ //package com.java2s; public class Main { public static void main(String[] argv) throws Exception { double logX = 2.45678; double logY = 2.45678; System.out.println(logDiffLogs(logX, logY)); } /** Get the log( exp( logX ) - exp( logY ) ). * * @param logX Log( x ) * @param logY Log( y ) * * @return log( x - y ) . */ public static double logDiffLogs(double logX, double logY) { return logX + log1p(-Math.exp(logY - logX)); } /** Get log of a double + 1. * * @param x The number for which we want log( x + 1 ). * * @return The log of ( x + 1 ). * * <p> * Example: log1p( 0.001D ) is 9.995003330835334E-4 * </p> * * <p> * Implements a method suggested by William Kahan. * </p> */ public static double log1p(double x) { double result; double u; // Use log(), corrected to first order // for truncation loss. u = 1.0D + x; if (u == 1.0D) { result = x; } else { result = (Math.log(u) * (x / (u - 1.0D))); } return result; } }