001/* 002 * Units of Measurement Implementation for Java SE 003 * Copyright (c) 2005-2017, Jean-Marie Dautelle, Werner Keil, V2COM. 004 * 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without modification, 008 * are permitted provided that the following conditions are met: 009 * 010 * 1. Redistributions of source code must retain the above copyright notice, 011 * this list of conditions and the following disclaimer. 012 * 013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions 014 * and the following disclaimer in the documentation and/or other materials provided with the distribution. 015 * 016 * 3. Neither the name of JSR-363 nor the names of its contributors may be used to endorse or promote products 017 * derived from this software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030package tec.uom.se.function; 031 032import java.math.BigDecimal; 033import java.math.MathContext; 034import java.util.Objects; 035 036import tec.uom.lib.common.function.ValueSupplier; 037import tec.uom.se.AbstractConverter; 038 039/** 040 * <p> 041 * This class represents a exponential converter of limited precision. Such converter is used to create inverse of logarithmic unit. 042 * 043 * <p> 044 * This class is package private, instances are created using the {@link LogConverter#inverse()} method. 045 * </p> 046 * 047 * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a> 048 * @author <a href="mailto:units@catmedia.us">Werner Keil</a> 049 * @version 1.0, Oct 10, 2016 050 * @since 1.0 051 */ 052public final class ExpConverter extends AbstractConverter implements ValueSupplier<String> { 053 054 /** 055 * 056 */ 057 private static final long serialVersionUID = -8851436813812059827L; 058 059 /** 060 * Holds the logarithmic base. 061 */ 062 private final double base; 063 064 /** 065 * Holds the natural logarithm of the base. 066 */ 067 private final double logOfBase; 068 069 /** 070 * Creates a logarithmic converter having the specified base. 071 * 072 * @param base 073 * the logarithmic base (e.g. <code>Math.E</code> for the Natural Logarithm). 074 */ 075 public ExpConverter(double base) { 076 this.base = base; 077 this.logOfBase = Math.log(base); 078 } 079 080 /** 081 * Returns the exponential base of this converter. 082 * 083 * @return the exponential base (e.g. <code>Math.E</code> for the Natural Exponential). 084 */ 085 public double getBase() { 086 return base; 087 } 088 089 @Override 090 public AbstractConverter inverse() { 091 return new LogConverter(base); 092 } 093 094 @Override 095 public final String toString() { 096 if (base == Math.E) { 097 return "e"; 098 } else { 099 return "Exp(" + base + ")"; 100 } 101 } 102 103 @Override 104 public boolean equals(Object obj) { 105 if (this == obj) { 106 return true; 107 } 108 if (obj instanceof ExpConverter) { 109 ExpConverter that = (ExpConverter) obj; 110 return Objects.equals(base, that.base); 111 } 112 return false; 113 } 114 115 @Override 116 public int hashCode() { 117 return Objects.hash(base); 118 } 119 120 @Override 121 public double convert(double amount) { 122 return Math.exp(logOfBase * amount); 123 } 124 125 @Override 126 public BigDecimal convert(BigDecimal value, MathContext ctx) throws ArithmeticException { 127 return BigDecimal.valueOf(convert(value.doubleValue())); // Reverts to 128 // double 129 // conversion. 130 } 131 132 @Override 133 public boolean isLinear() { 134 return false; 135 } 136 137 @Override 138 public String getValue() { 139 return toString(); 140 } 141}