public final class LogMath implements Configurable, Serializable
log(a - b) = log(a) + log(1 - exp(log(b)-log(a)))
log(a + b) = log(a) +log(1 + exp(log(b)- log(a)))
作用:首先本类是一个component即可配置类。本类主要的作用是:提供在LOG(对数)域的进行操作的方法。以及把线性域如k=xy变成logk=logxy 的方法(即线性域到log域),以及
把log域变成线性域的方法如:logk=logxy 变成k=xy。本类只是提供了数学上的方法,使得线性域的乘除法变的容易,同时是计算变的简单。
本类的主要属性:
@S4Double(defaultValue = 1.0001)
String PROP_LOG_BASE = "logBase";用来进行默认设置。
@S4Boolean(defaultValue = true)
String PROP_USE_ADD_TABLE = "useAddTable";用来对useAddTable进行默认设置。
private float logBase; property配置属性即是我们想要的对数的底。
private boolean useAddTable;property配置属性。一般为false。
以及一些短时存在的属性:如Logger logger,
本类的构造方法:
本类有两个构造方法:1,public LogMath():空的构造方法,什么也不做,通过ps来进行属性的配置。
2,LogMath(float logBase, boolean useAddTable):本构造方法通过输入配置属性来进行初始化,是一种硬编码的形式。其中调用了init()方法。
本类的方法
init():本方法:设置了短时属性naturalLogBase,inverseNaturalLogBase,maxLogValue,minLogValue,logger。当useAddTable为真时,还创建了一个theAddTable[index],theAddTable中的存储形式为log( 1.0 + power(base, index)),entriesInTheAddTable用于确定theAddTable的长度。entriesInTheAddTable = (int) -Math.rint(linearToLog(logToLinear(0.5f) - 1));
1, float linearToLog(double linearValue):本方法的返回为,如果返回超过浮点数的范围则取相应的浮点数的最大值或最小值。如输入参数为0则返回-Float.MAX_VALUE。
2, double logToLinear(float logValue):本法返回的是,如果输入超过相应的范围则返回对应的最值。
3, logToLn(float logSource):本法返回为:,如果输入参数超过范围,则取其相应的最值输出。
4, getLogZero():返会为logZero = -Float.MAX_VALUE即为浮点数范围的最小值
5, getLogOne():返回logOne
6, getLogBase():返回LogBase即log的底。Loglogbase。
7, isUseAddTable():返回UseAddTable
8, log10(float value):本方法返回:即为(float) (0.4342944819 * java.lang.Math.log(value))。
9, linearToLog(float[] vector):把矢量数组中的每一个都转成的形式后放入输入数组(即原数组中)中输出。
10, logToLinear(float[] vector, float[] out):把vector中的每个值转换为形式,然后放入out数组中。
11, logToLog(float logSource, float sourceBase float resultBase):本方法返回为,如果logSource为logzero则返回logzero。即把以sourceBase为底的对数转换为以resultBase为底的对数。如果logSource= 则 返回为
12, log10ToLog(float logSource):返回为。即把以10为底的对数,转换为以logbase为底的对数。
13, lnToLog(float logSource):本方法返回的是当logsource=lnx 即返回的为 。
14, subtractAsLinear(float logMinuend, float logSubtrahend):因为:log(a - b) = log(a) + log(1 - exp(log(b)-log(a)))如果logMinuend= log(a),logSubtrahend= log(b),那么本方法返回的是log(a - b)。
addTable(float index):因为:log(a + b)= log(a) +log(1 + exp(log(b) - log(a))),根据useAddTable的情况来定,如果useAddTable为真则返回的是
int intIndex = (int) (index + 0.5);
if (0 <= intIndex){
if (intIndex < theAddTable.length) {
return theAddTable[intIndex];
} else {
return 0.0f;}
否则返回的是addTableActualComputation(index)
15, addTableActualComputation(float index):因为log(a + b) = log(a) +log(1 + exp(log(b) - log(a))),本方法返回的是:log(1 + exp(0 - log(a))),其index= log(a)。
16, addAsLinear(float logVal1, float logVal2):本方法在useAddTable为false的情况下返回为log(a + b),其中 logVal2=log(a),logVal1= logVal1.
17, newProperties(PropertySheetps):用于对logmath重新配置。其中调用了init()方法。