This is due to rounding errors from using a data type floatthat is a 32-bit IEEE 754 with one floating point precision . When a number requires more precision than a data type can handle it, it will be rounded - this will happen when you add a few floats together.
float BigDecimal, :
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundingErrors {
private static final BigDecimal ONE = new BigDecimal( 1 );
static BigDecimal RecursiveFunction(int num){
if (num == 1) {
return ONE;
}
else {
return ONE.divide( new BigDecimal( num ), 100, RoundingMode.CEILING ).add( RecursiveFunction(num - 1) );
}
}
static BigDecimal NonRecursiveFunction(int num) {
BigDecimal total = new BigDecimal( 0 );
while (num > 0) {
total = total.add( ONE.divide( new BigDecimal( num ), 100, RoundingMode.CEILING ) );
num -= 1;
}
return total;
}
public static void main(String[] args) {
System.out.println( RecursiveFunction( 1000 ));
System.out.println( NonRecursiveFunction( 1000 ));
}
}
7.4854708605503449126565182043339001765216791697088036657736267499576993491652024409599344374118451321
7.4854708605503449126565182043339001765216791697088036657736267499576993491652024409599344374118451321