Всем добрый день. Есть следующее задание: Требуется реализовать параллельный алгоритм получения суммы последовательности элементов вида 1/a[i] с использованием класса RecursiveAction. Моя реализация была такая: '''
package com.company;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.ForkJoinPool;
public class Main {
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool();
double[] data = new double[100000];
double result=0;
for (int i = 0; i < data.length; i++) {
data[i] = (double) i+1;
//System.out.println(data[i]);
}
SumArr app = new SumArr(data, 0, data.length);
pool.invoke(app);
System.out.println("Параллельное вычисление: " + app.result);
for (int i = 0; i<data.length;i++ )
{
result += 1/data[i];
}
result = (result/data.length);
System.out.println("Последовательное вычисление: " + result);
}
}
class SumArr extends RecursiveAction{
final int LIMIT = 100;
double result;
int start, end;
double[] data;
SumArr(double[] data, int start, int end) {
this.start = start;
this.end = end;
this.data = data;
}
@Override
protected void compute() {
if((end - start)< LIMIT){
for(int i= start;i<end;i++){
result+= 1/data[i];
}
result = (result/data.length);
}else {
int mid = (start + end)/2;
SumArr left = new SumArr(data, start, mid);
SumArr right = new SumArr(data, mid, end);
left.fork();
right.fork();
left.join();
right.join();
result = left.result + right.result;
}
}
}
'''
Однако при выводе результатов оказывается, что числа после запятой отличаются в последних знаках. В чем может быть проблема и как можно исправить?

Doubleлучше использоватьBigDecimal– Дмитрий Алексеенко Oct 14 '22 at 07:20