C语言 为什么我在使用openMP计算数组的平均值时会得到错误的结果?

gijlo24d  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(90)
#include <stdio.h>
#include <omp.h>

#define N 5

int X[N];

int main() {
    int num = 0;
    int moy = 0;

    // Initialize the array (you should populate it as needed)
    for (int i = 0; i < N; i++) {
        X[i] = i * 2; // Example initialization
    }

    // Calculate the average
    #pragma omp parallel for reduction(+:moy)
    for (int i = 0; i < N; i++) {
        moy += X[i] / N;
    }

    // Count elements greater than the average
    #pragma omp parallel for reduction(+:num)
    for (int i = 0; i < N; i++) {
        if (X[i] > moy) {
            num++;
        }
    }

    printf("%d\n", num);

    return 0;
}

如果我为数组的mean、num和elements编写print语句,我会得到以下输出:
平均值(百万美元):2
X中的元素:0 2 4 6 8
大于平均值的元素数:3

yhuiod9q

yhuiod9q1#

这不是一个openmp问题,你将moy声明为int,然后计算你所做的平均值:
moy += X[i] / N;
你的X数组包含0, 2, 4, 6, 8N = 5,当执行除法时,你试图把double放在int里面,所以你的总和本质上是:
0/5 = 0 + 2/5 = 0 + 4/5 = 0 + 6/5 = 1 + 8/5 = 1 = 0+0+0+1+1 = 2
您需要将moyX设为double,或者更好地将moy设为double,对moy中的所有元素求和,然后执行moy/N以获得正确的结果

相关问题