BigDecimal quadratic : BigDecimal « Data Type « Java






BigDecimal quadratic

 

/*
 * @(#)MathUtil.java  1.0 Apr 26, 2008
 *
 *  The MIT License
 *
 *  Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;



public class Util{
  protected static BigInteger BigIntegerZERO = BigInteger.ZERO;
  protected static BigInteger BigIntegerONE = BigInteger.ONE;
  protected static BigInteger BigIntegerTWO = BigInteger.valueOf(2);
  protected static BigInteger BigIntegerTHREE=BigInteger.valueOf(3);
  protected static BigInteger FactorialBreakpoint = BigInteger.valueOf(96);
  protected static BigDecimal BigDecimalZERO = BigDecimal.ZERO;
  protected static BigDecimal BigDecimalONE = BigDecimal.ONE;
  protected static BigDecimal BigDecimalTWO = new BigDecimal(2);
  protected static BigDecimal BigDecimalFOUR = new BigDecimal(4);
  

  public static BigDecimal[] quadratic(BigDecimal a, BigDecimal b, BigDecimal c, RoundingMode rounding)
  {
    // ax^2 + bx + c = 0
    BigDecimal part1 = b.negate();
    BigDecimal part2 = sqrt(b.multiply(b).subtract(BigDecimalFOUR.multiply(a).multiply(c)), rounding);
    BigDecimal part3 = BigDecimalTWO.multiply(a);
    BigDecimal[] toRet = new BigDecimal[2];
    toRet[0] = (part1.subtract(part2)).divide(part3, RoundingMode.CEILING);
    toRet[1] = (part1.add(part2)).divide(part3, RoundingMode.CEILING);
    return toRet;
  }
  public static BigInteger sqrt(BigInteger number)
  {
    return sqrt(number, BigIntegerONE);
  }

  public static BigDecimal sqrt(BigDecimal number, RoundingMode rounding)
  {
    return sqrt(number, BigDecimalONE, rounding);
  }

  protected static BigInteger sqrt(BigInteger number, BigInteger guess)
  {
    // ((n/g) + g)/2: until same result twice in a row
//    BigInteger result = number.divide(guess).add(guess).divide(BigIntegerTWO);
//    if(result.compareTo(guess) == 0)
//      return result;
//
//    return sqrt(number, result);

    // redoing this to avoid StackOverFlow
    BigInteger result = BigIntegerZERO;
    BigInteger flipA = result;
    BigInteger flipB = result;
    boolean first = true;
    while( result.compareTo(guess) != 0 )
    {
      if(!first)
        guess = result;
      else
        first=false;

      result = number.divide(guess).add(guess).divide(BigIntegerTWO);
      // handle flip flops
      if(result.equals(flipB))
        return flipA;

      flipB = flipA;
      flipA = result;
    }
    return result;

  }
  public static BigDecimal sqrt(BigDecimal number, BigDecimal guess, RoundingMode rounding)
  {
    BigDecimal result = BigDecimalZERO;
    BigDecimal flipA = result;
    BigDecimal flipB = result;
    boolean first = true;
    while( result.compareTo(guess) != 0 )
    {
      if(!first)
        guess = result;
      else
        first=false;

      result = number.divide(guess, rounding).add(guess).divide(BigDecimalTWO, rounding);
      // handle flip flops
      if(result.equals(flipB))
        return flipA;

      flipB = flipA;
      flipA = result;
    }
    return result;
  }
}

   
  








Related examples in the same category

1.Round a double
2.Create Big Decimal Values via a long
3.Create a BigDecimal vis string
4.Multiply one BigDecimal to another BigDecimal
5.Subtract from one BigDecimal another BigDecimal
6.Divide one BigDecimal from another BigDecimal
7.Negate a BigDecimal
8.Setting the Decimal Place of a Big Decimal Value
9.Truncates the big decimal value
10.Do math operation for BigDecimal
11.Operate with big decimal values
12.Round a double by setting the scale
13.Create Big Decimal Values via a string
14.Calculation with BigDecimal
15.Parse BigDecimal
16.Formats BigDecimal into a SQL floating-point literal
17.Value is rounded using the given method which is any method defined in BigDecimal
18.Round the given value to the specified number of decimal places. The value is rounded using the BigDecimal.ROUND_HALF_UP method.
19.Convert Object to BigDecimal
20.BigDecimal and BigInteger sqare root