Окончательный результат моих вычислений равен 0, но когда я печатаю результат в моем методе run()
, правильный результат появляется после завершения моего метода main
. Кто-нибудь знает, почему это происходит?
@Override
public void run() {
BigDecimal counter = BigDecimal.ZERO;
BigDecimal numOfAllThreadsBigDecimal = new BigDecimal(getNumOfAllThreads());
BigDecimal numOfThreadBigDecimal = new BigDecimal(getNumOfThread());
BigDecimal numerator = BigDecimal.ZERO;
BigDecimal divisor = BigDecimal.ZERO;
BigDecimal endResult = BigDecimal.ZERO;
while (!isFlag()) {
// counter % numOfAllThreads == numOfThread
if (counter.remainder(numOfAllThreadsBigDecimal).equals(numOfThreadBigDecimal)) {
// (4 * counter)! * (1103 + 26390 * counter)
numerator = BigDecimalFactorial.factorial((counter.multiply(new BigDecimal(4)))).multiply(new BigDecimal(1103).add((new BigDecimal(26390).multiply(counter))));
// (counter!)^4 * 396^4*counter
divisor = ((BigDecimalFactorial.factorial(counter)).pow(4)).multiply( (new BigDecimal(396).pow(4 * counter.intValue())) ) ;
// numerator / divisor
endResult = endResult.add(((numerator.divide(divisor, 100, RoundingMode.HALF_UP))));
internalSteps++;
}
counter = counter.add(BigDecimal.ONE);
}
// multiply endResult by sqrt(8) / 9801
endResult = endResult.multiply(((BigDecimalSqrt.bigSqrt(new BigDecimal(8))).divide(new BigDecimal(9801),100,RoundingMode.HALF_UP)));
// divide 1 / pi
endResult = BigDecimal.ONE.divide(endResult, 100, RoundingMode.HALF_UP);
System.out.println(endResult);
setThreadResult(endResult);
}
public BigDecimal getValue() {
BigDecimal result = BigDecimal.ZERO;
for(Ramanujan worker : workers)
result = result.add(worker.getThreadResult());
this.value = result;
return this.value;
}
public static void main(String[] args) {
CalculatePi pi = new Ramanujan();
pi.startCalculation();
long timeStart = System.currentTimeMillis();
int i = 0;
while(i < MAX_PRECISION) {
someDelay();
i++;
}
long timeStop = System.currentTimeMillis();
pi.stopCalculation();
System.out.println((timeStop - timeStart) + " ms");
System.out.println("Result: " + pi.getValue());
System.out.println("IternalSteps: " + pi.getInternalSteps());
}
Результат на консоли:
10004 ms (that's correct)
Result: 0
InternalSteps: 2088
3.141592653589793...
Номер 3.141592653589793 должен появиться в строке результатов.