package mikera.vectorz.ops;
import mikera.vectorz.Op;
import mikera.vectorz.Ops;
/**
* The renowned exponential function
*
* @author Mike
*
*/
public final class LogN extends AFunctionOp {
private final double base;
private final double logBase;
public static final LogN LOG10=create(10);
private LogN(double base) {
this.base=base;
this.logBase=Math.log(base);
}
public static LogN create(double base) {
return new LogN(base);
}
public double getBase() {
return base;
}
@Override
public double apply(double x) {
return Math.log(x)/logBase;
}
@Override
public double derivative(double x) {
return 1.0/x;
}
@Override
public double derivativeForOutput(double y) {
return 1/Math.exp(y);
}
@Override public double applyInverse(double y) {
return Math.exp(y*logBase);
}
@Override public boolean hasDerivative() {return true;}
@Override public boolean hasInverse() {return true;}
@Override public double minDomain() {return Double.MIN_VALUE;}
@Override public Op getInverse() {return Exp.INSTANCE.compose(Linear.create(logBase, 0.0));}
@Override public Op getDerivativeOp() {return Ops.RECIPROCAL;}
}