This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

数据精度



用C6474实现了一个浮点的矩阵求逆的算法(直接定义浮点的矩阵即采用C语言里面的库函数),但在CCS里得到的结果和用MATLAB以及visual studio里面得到的不一样,有零点几的差距,这是为什么?同样的程序,不一样的结果,有什么解决的方法吗?谢谢

  • 关于单精度浮点数matlab和c6XXX中的存储是一致的

    都是

    1位符号位8位指数位和23位尾数 他们都符合IEEE的标准。

    至于你求的两次值不一样,可能是库函数和matlab中各自求逆的方法和数据处理的方式不同的原因

  • 可是我的求逆的程序是自己所编,一样的代码,在VC中实现时,得到的结果与MATLAB中得到的数据基本一样,但在CCS中时在未采用优化前(如-o3)时,结果就已经有一定的差别,而采用优化后结果相差就更大了,这是为什么?谢谢

  • 你好,

    我刚才在你的问题中“在CCS里得到的结果和用MATLAB以及visual studio里面得到的不一样,有零点几的差距”这句话理解成了,你在CCS中的程序算出的结果和matlab算得结果不同,所以我怀疑是C代码和matlab中的处理的方法和数据处理的方式不同。

    你方便把你代码贴出来吗?

    我看一下,也给论坛中的其他同事看下,帮你分析下原因!

    谢谢。

  • 整体程序是由3个核共同完成的,其中一个核作为主核(核0),控制其他两个核的操作,采用IPC模块实现核间通信,sendmessageonIPC(1),sendmessageonIPC(2)分别代表通知另外两个核,1表示是通知核1,2表示通知核2,这两句代码的顺序调换一下,得到的结果也不一样,数据会出现1.#QNAN,不明白它的意思,但是我的程序的思想和这个顺序应该是无关的,以下是核1与核2中主要实现计算的代码:

    ////////////////////////////////////////////////////////

    e=0;

    for(i=0;i<4;i++)

    e+=pDdr2Data_A[i * COLUMN + p_1] * pDdr2Data_A[i * COLUMN + q_1];

    if(abs(e)>1e-9){

    P=pDdr2Data_length[p_1],Q=pDdr2Data_length[q_1];

    if(P<Q){

    //********交换A,V的两列*****

    for(i=0;i<4;i++){

    temp=pDdr2Data_A[i * COLUMN + p_1];

    pDdr2Data_A[i * COLUMN + p_1]=pDdr2Data_A[i * COLUMN + q_1];

    pDdr2Data_A[i * COLUMN + q_1]=temp;

    temp=pDdr2Data_V[i * COLUMN + p_1];

    pDdr2Data_V[i * COLUMN + p_1]=pDdr2Data_V[i * COLUMN + q_1];

    pDdr2Data_V[i * COLUMN + q_1]=temp;

    }

    //************************

    temp=P;

    P=Q;

    Q=temp;

    temp=pDdr2Data_length[p_1];

    pDdr2Data_length[p_1]=pDdr2Data_length[q_1];

    pDdr2Data_length[q_1]=temp;

    //************************

    }

    t=(Q-P)/(2 * e);

    //**************由t算alfa的,

    if(fabs(t)>1024)

    ;//continue;

    else{

    if(fabs(t)>8)        

    alfa=1/(2 * t);

    else{

    if(fabs(t)>0.25){

    if(t>=0) alfa=-t+sqrt(1+t * t);

    else alfa=-t-sqrt(1+t * t);

    }

    else

    alfa=1-t+t * t/2;

    }

    }

       /////////////////////////////////////////////////////////////////////

    pDdr2Data_length[p_1]=P-2 * alfa * e+alfa * alfa * Q;

    pDdr2Data_length[q_1]=alfa * alfa * P+2 * alfa * e+Q;

       ////////////////////////////////////////////////////////////////////

    for(i=0;i<4;i++){

    temp=pDdr2Data_A[i * COLUMN + p_1]-alfa * pDdr2Data_A[i * COLUMN + q_1];

    pDdr2Data_A[i * COLUMN + q_1]=alfa * pDdr2Data_A[i * COLUMN + p_1] + pDdr2Data_A[i * COLUMN + q_1];

    pDdr2Data_A[i * COLUMN + p_1]=temp;

    temp=pDdr2Data_V[i * COLUMN + p_1]- alfa * pDdr2Data_V[i * COLUMN + q_1];

    pDdr2Data_V[i * COLUMN + q_1]=alfa * pDdr2Data_V[i * COLUMN + p_1]+ pDdr2Data_V[i * COLUMN + q_1];

    pDdr2Data_V[i * COLUMN + p_1]=temp;

    }

    }

    谢谢了

  • 你好,

    几条建议希望你在做下实验来确定问题的根源

    1.简化你的测试矩阵,比如3×3.

    2.矩阵元素用int型的做下实验

    3.你要用和VC一样的程序来做对比,先不要用多核,先用一个核跑

    谢谢