我只需要一点帮助,把这行八度转换成opencl,我想我对翻译^ to pow is octave/opencl代码感到困惑,但结果并不相同。
v1=0.3;
E1=(207*(10^9));
E2=(3*(10^6));
v2=0.49;倍频程
Ers=1/(1/pi*((1-v1^2)/E1+(1-v2^2)/E2));%MPa Whats this look like in c
DEF=(6*n*U*B^2)/Er/(sigma^3);我的opencl尝试翻译
Ers=(1.00/(1.00/pi*)((1.00-pow(v1 ,2))/E1+(1.00-pow(v2,2)/E2)),//MPa DEF=6*n*U*pow(B,2)/Er/pow(σ,3);
倍频程结果//ers 1.2402e+07 //DEF 30.962
opencl结果Ers 139.336666 DEF -0.000003
不知道我做错了什么,但如果有人看到了,请帮忙谢谢
发布于 2014-01-26 13:30:55
OpenCL是从C99派生而来的,所以您可以用一个普通的普通C程序来检查您的转换是否正确。
如果我取你的C版本的Ers计算并用C运行它,我得到的结果与你的八度结果相匹配。我怀疑您的问题在于E1和E2常量值的定义。如果我将这些内容粘贴到C程序中,没有改变,我得到的答案非常类似于您的OpenCL结果。问题是,尽管10^9在C中语法上是有效的,但它并不意味着与在Octave中相同(^是C中的位XOR运算符)。相反,您应该使用科学的E符号,例如1e9。
因此,这里有一个完整的C程序,它使用几乎逐字复制的C代码计算Ers值,只修正常量值。这将在我的系统上产生输出Ers = 1.24024e+07。
#include <math.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
double v1 = 0.3;
double E1 = (207*(1e9));
double E2 = (3*(1e6));
double v2 = 0.49;
double pi = M_PI;
double Ers = (1.00/(1.00/pi*((1.00-pow(v1,2))/E1+(1.00-pow(v2, 2))/E2)));
printf("Ers = %g\n", Ers);
return 0;
}https://stackoverflow.com/questions/21363729
复制相似问题