1
0
mirror of https://github.com/DanilaFe/abacus synced 2024-12-23 16:00:09 -08:00

Change ceiling and floor to return NumberInterface. Add fractional part function. Add intValue function. Change StandardPlugin correspondingly.

This commit is contained in:
Arthur Drobot 2017-08-02 12:00:56 -07:00
parent c027a23dcb
commit 44ad5b3a6c
4 changed files with 60 additions and 12 deletions

View File

@ -94,13 +94,23 @@ public class NaiveNumber implements NumberInterface {
} }
@Override @Override
public int ceiling() { public NumberInterface ceiling() {
return (int) Math.ceil(value); return new NaiveNumber(Math.ceil(value));
} }
@Override @Override
public int floor() { public NumberInterface floor() {
return (int) Math.floor(value); return new NaiveNumber(Math.floor(value));
}
@Override
public NumberInterface fractionalPart() {
return new NaiveNumber(value - Math.floor(value));
}
@Override
public int intValue() {
return (int)value;
} }
@Override @Override

View File

@ -83,13 +83,26 @@ public interface NumberInterface {
* Returns the least integer greater than or equal to the number. * Returns the least integer greater than or equal to the number.
* @return the least integer >= the number, if int can hold the value. * @return the least integer >= the number, if int can hold the value.
*/ */
int ceiling(); NumberInterface ceiling();
/** /**
* Return the greatest integer less than or equal to the number. * Return the greatest integer less than or equal to the number.
* @return the greatest int >= the number, if int can hold the value. * @return the greatest int >= the number, if int can hold the value.
*/ */
int floor(); NumberInterface floor();
/**
* Returns the fractional part of the number.
* @return the fractional part of the number.
*/
NumberInterface fractionalPart();
/**
* Returns the integer representation of this number, discarding any fractional part,
* if int can hold the value.
* @return
*/
int intValue();
/** /**
* Promotes this class to another number class. * Promotes this class to another number class.

View File

@ -96,13 +96,38 @@ public class PreciseNumber implements NumberInterface {
} }
@Override @Override
public int ceiling() { public NumberInterface ceiling() {
return (int) Math.ceil(value.doubleValue()); String str = value.toPlainString();
int decimalIndex = str.indexOf('.');
if(decimalIndex != -1){
return this.floor().add(ONE);
}
return this;
} }
@Override @Override
public int floor() { public NumberInterface floor() {
return (int) Math.floor(value.doubleValue()); String str = value.toPlainString();
int decimalIndex = str.indexOf('.');
if(decimalIndex != -1){
return new PreciseNumber(str.substring(0, decimalIndex));
}
return this;
}
@Override
public NumberInterface fractionalPart() {
String str = value.toPlainString();
int decimalIndex = str.indexOf('.');
if(decimalIndex != -1){
return new PreciseNumber(str.substring(decimalIndex + 1));
}
return ZERO;
}
@Override
public int intValue() {
return value.intValue();
} }
@Override @Override

View File

@ -174,7 +174,7 @@ public class StandardPlugin extends Plugin {
//right and left refer to lhs and rhs in the above inequality. //right and left refer to lhs and rhs in the above inequality.
NumberInterface sum = NaiveNumber.ONE.promoteTo(params[0].getClass()); NumberInterface sum = NaiveNumber.ONE.promoteTo(params[0].getClass());
NumberInterface nextNumerator = params[0]; NumberInterface nextNumerator = params[0];
NumberInterface left = params[0].multiply((new NaiveNumber(3)).promoteTo(params[0].getClass()).intPow(params[0].ceiling())), right = maxError; NumberInterface left = params[0].multiply((new NaiveNumber(3)).promoteTo(params[0].getClass()).intPow(params[0].ceiling().intValue())), right = maxError;
do{ do{
sum = sum.add(nextNumerator.divide(factorial(params[0].getClass(), n+1))); sum = sum.add(nextNumerator.divide(factorial(params[0].getClass(), n+1)));
n++; n++;
@ -434,7 +434,7 @@ public class StandardPlugin extends Plugin {
private static NumberInterface getSmallAngle(NumberInterface phi){ private static NumberInterface getSmallAngle(NumberInterface phi){
NumberInterface twoPi = getPi(phi.getClass()).multiply(new NaiveNumber("2").promoteTo(phi.getClass())); NumberInterface twoPi = getPi(phi.getClass()).multiply(new NaiveNumber("2").promoteTo(phi.getClass()));
NumberInterface theta = FUNCTION_ABS.apply(phi).subtract(twoPi NumberInterface theta = FUNCTION_ABS.apply(phi).subtract(twoPi
.multiply(new NaiveNumber(FUNCTION_ABS.apply(phi).divide(twoPi).floor()).promoteTo(phi.getClass()))); //Now theta is in [0, 2pi). .multiply(FUNCTION_ABS.apply(phi).divide(twoPi))); //Now theta is in [0, 2pi).
if(phi.signum() < 0){ if(phi.signum() < 0){
theta = twoPi.subtract(theta); theta = twoPi.subtract(theta);
} }