1   /**
2    * Investor, the open-source investment library
3    *
4    * (C) Copyright 2008, by individual contributors as indicated by the @author tag.
5    *
6    * This library is free software; you can redistribute it and/or modify it
7    * under the terms of the GNU Lesser General Public License as
8    * published by the Free Software Foundation; either version 2.1 of
9    * the License, or (at your option) any later version.
10   *
11   * This software is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this software; if not, write to the Free
18   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
20   */
21  package com.nickokiss.investor.calc;
22  
23  import java.math.BigDecimal;
24  
25  import org.apache.commons.lang.builder.EqualsBuilder;
26  import org.apache.commons.lang.builder.HashCodeBuilder;
27  
28  import com.nickokiss.investor.util.TkFinConstants;
29  
30  /**
31   * 
32   * @author Tomasz Koscinski <tomasz.koscinski@nickokiss.com>
33   */
34  public class MathCalc {
35    public BigDecimal ZERO = BigDecimal.ZERO;
36    public BigDecimal ONE = BigDecimal.ONE;
37    public BigDecimal TWO = new BigDecimal("2");
38    public BigDecimal TEN = BigDecimal.TEN;
39    public BigDecimal ONE_HUNDRED = new BigDecimal("100");
40  
41    public BigDecimal getUnit(int scale) {
42      if (scale >= 0) {
43        return ONE.divide(TEN.pow(scale), scale + 1, BigDecimal.ROUND_HALF_UP);
44      } else {
45        return TEN.pow(scale * (-1));
46      }
47    }
48    
49    public BigDecimal div(BigDecimal number, BigDecimal divisor) {
50      return number.divide(divisor, TkFinConstants.DEFAULT_SCALE, TkFinConstants.DEFAULT_ROUNDING_MODE);
51    }
52    
53    public BigDecimal invert(BigDecimal number) {
54      return div(ONE, number);
55    }
56  
57    public BigDecimal log(BigDecimal base, BigDecimal number) {
58      // result = log[base](number) = log(number) / log(base)
59      return div(log(number), log(base));
60    }
61    
62    public BigDecimal log(BigDecimal number) {
63      return new BigDecimal(Math.log(number.doubleValue())); 
64    }
65    
66    public BigDecimal pow(BigDecimal base, BigDecimal exponent) {
67      return new BigDecimal(Math.pow(base.doubleValue(), exponent.doubleValue()));
68    }
69    
70    public BigDecimal exp(BigDecimal number) {
71      return new BigDecimal(Math.exp(number.doubleValue()));
72    }
73    
74    public int hashCode() {
75      return HashCodeBuilder.reflectionHashCode(this);
76    }
77  
78    public boolean equals(Object obj) {
79      return EqualsBuilder.reflectionEquals(this, obj);
80    }  
81  
82  }