1
0
mirror of https://github.com/DanilaFe/abacus synced 2024-11-16 07:33:09 -08:00
Abacus/src/org/nwapw/abacus/number/NaiveNumber.java

104 lines
2.6 KiB
Java
Raw Normal View History

package org.nwapw.abacus.number;
2017-07-25 22:47:48 -07:00
/**
* An implementation of NumberInterface using a double.
*/
public class NaiveNumber implements NumberInterface {
2017-07-25 22:47:48 -07:00
/**
* The value of this number.
*/
private double value;
2017-07-25 22:47:48 -07:00
/**
* Creates a new NaiveNumber with the given value.
* @param value the value to use.
*/
public NaiveNumber(double value) {
this.value = value;
}
2017-07-25 22:47:48 -07:00
/**
* The number zero.
*/
public static final NaiveNumber ZERO = new NaiveNumber(0);
2017-07-25 22:47:48 -07:00
/**
* The number one.
*/
public static final NaiveNumber ONE = new NaiveNumber(1);
2017-07-24 13:43:51 -07:00
@Override
public int precision() {
return 18;
2017-07-24 13:43:51 -07:00
}
@Override
public NumberInterface multiply(NumberInterface multiplier) {
return new NaiveNumber(value * ((NaiveNumber)multiplier).value);
}
@Override
public NumberInterface divide(NumberInterface divisor) {
2017-07-24 13:44:09 -07:00
return new NaiveNumber(value / ((NaiveNumber)divisor).value);
}
@Override
public NumberInterface add(NumberInterface summand) {
2017-07-24 13:44:09 -07:00
return new NaiveNumber(value + ((NaiveNumber)summand).value);
}
@Override
public NumberInterface subtract(NumberInterface subtrahend) {
2017-07-24 13:44:09 -07:00
return new NaiveNumber(value - ((NaiveNumber)subtrahend).value);
}
@Override
public NumberInterface negate() {
return new NaiveNumber(-value);
}
@Override
public NumberInterface intPow(int exponent) {
if(exponent == 0){
return NaiveNumber.ONE;
}
boolean takeReciprocal = exponent < 0;
exponent = Math.abs(exponent);
NumberInterface power = this;
2017-07-25 14:18:00 -07:00
for(int currentExponent = 1; currentExponent < exponent; currentExponent++){
power = power.multiply(this);
}
if(takeReciprocal){
power = NaiveNumber.ONE.divide(power);
}
return power;
}
@Override
public int compareTo(NumberInterface number) {
NaiveNumber num = (NaiveNumber) number;
return Double.compare(value, num.value);
}
@Override
public int signum() {
return this.compareTo(ZERO);
}
2017-07-24 14:37:56 -07:00
@Override
public NumberInterface promoteTo(Class<? extends NumberInterface> toClass) {
2017-07-24 14:37:56 -07:00
if(toClass == this.getClass()) return this;
else if(toClass == PreciseNumber.class){
return new PreciseNumber(Double.toString(value));
}
2017-07-24 14:37:56 -07:00
return null;
}
public String toString(){
2017-07-28 09:57:39 -07:00
double shiftBy = Math.pow(10, 10);
return Double.toString(Math.round(value * shiftBy) / shiftBy);
}
}