作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我使用openmp的解决方案,该解决方案用于并行化计算Pi的代码。 Pi的浮点值每次执行时都会改变。有人可以解释为什么吗?
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define THREAD_NUM 20
static long num_steps = 100000;
double step;
int main(){
int i;
double x;
double pi;
double sum = 0.0;
double t1 = 0.0;
double t2 = 0.0;
step = 1.0/(double) num_steps;
omp_set_num_threads(THREAD_NUM);
t1 = omp_get_wtime();
#pragma omp parallel
{
double p_sum = 0.0;
#pragma omp for
for(i=0; i<num_steps; i++){
x = (i+0.5)*step;
p_sum = p_sum + 4.0/(1.0+x*x);
}
#pragma omp atomic
sum += p_sum;
}
t2 = omp_get_wtime();
pi = step*sum;
printf("value of pi = %lf\n", pi);
printf("time = %lf ms\n", (t2-t1)*1000);
}
最佳答案
浮点加法既不是关联的也不是可交换的!这意味着您获得的确切值取决于p_sum
/sum
组件的添加顺序。要精确地理解为什么您必须了解浮点加法在实际中是如何工作的。我建议阅读What Every Computer Scientist should Know About Floating-Point Arithmetic。
关于c - 为什么这段使用openmp计算Pi值的代码每次给出的答案(最后几个 float )都略有不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63701472/
直接问题:对于一个类对象的三个(或更多)几乎相同的拷贝,我怎样才能最好(或最有效)地存储它们之间的差异? 背景:我有一个需要一组参数的算法: struct params { std::strin
我是一名优秀的程序员,十分优秀!