001: /*
002: * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences.
003: * Copyright (C) 2006 - JScience (http://jscience.org/)
004: * All rights reserved.
005: *
006: * Permission to use, copy, modify, and distribute this software is
007: * freely granted, provided that this notice is preserved.
008: */
009: package javax.measure.converter;
010:
011: /**
012: * <p> This class represents a logarithmic converter. Such converter
013: * is typically used to create logarithmic unit. For example:[code]
014: * Unit<Dimensionless> BEL = Unit.ONE.transform(new LogConverter(10).inverse());
015: * [/code]</p>
016: *
017: * <p> Instances of this class are immutable.</p>
018: *
019: * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
020: * @version 3.1, April 22, 2006
021: */
022: public final class LogConverter extends UnitConverter {
023:
024: /**
025: * Holds the logarithmic base.
026: */
027: private final double _base;
028:
029: /**
030: * Holds the natural logarithm of the base.
031: */
032: private final double _logBase;
033:
034: /**
035: * Holds the inverse of the natural logarithm of the base.
036: */
037: private final double _invLogBase;
038:
039: /**
040: * Holds the inverse of this converter.
041: */
042: private final Inverse _inverse = new Inverse();
043:
044: /**
045: * Creates a logarithmic converter having the specified base.
046: *
047: * @param base the logarithmic base (e.g. <code>Math.E</code> for
048: * the Natural Logarithm).
049: */
050: public LogConverter(double base) {
051: _base = base;
052: _logBase = Math.log(base);
053: _invLogBase = 1.0 / _logBase;
054: }
055:
056: /**
057: * Returns the logarithmic base of this converter.
058: *
059: * @return the logarithmic base (e.g. <code>Math.E</code> for
060: * the Natural Logarithm).
061: */
062: public double getBase() {
063: return _base;
064: }
065:
066: @Override
067: public UnitConverter inverse() {
068: return _inverse;
069: }
070:
071: @Override
072: public double convert(double amount) {
073: return _invLogBase * Math.log(amount);
074: }
075:
076: @Override
077: public boolean isLinear() {
078: return false;
079: }
080:
081: /**
082: * This inner class represents the inverse of the logarithmic converter
083: * (exponentiation converter).
084: */
085: private class Inverse extends UnitConverter {
086:
087: @Override
088: public UnitConverter inverse() {
089: return LogConverter.this ;
090: }
091:
092: @Override
093: public double convert(double amount) {
094: return Math.exp(_logBase * amount);
095: }
096:
097: @Override
098: public boolean isLinear() {
099: return false;
100: }
101:
102: private static final long serialVersionUID = 1L;
103: }
104:
105: private static final long serialVersionUID = 1L;
106: }
|