0

Всем добрый день. Есть следующее задание: Требуется реализовать параллельный алгоритм получения суммы последовательности элементов вида 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;

    }
}

}

'''

Однако при выводе результатов оказывается, что числа после запятой отличаются в последних знаках. В чем может быть проблема и как можно исправить? Результат выполнения. Последние числа после запятой различаются при величине массива свыше 10000

0 Answers0