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.

[参考译文] TMS320F28379D:关于计算性能

Guru**** 678420 points
Other Parts Discussed in Thread: C2000WARE, REMOTI
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/972394/tms320f28379d-about-calculation-performance

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

你好。

我使用 CCS10运行了以下程序。
我的目标是找到最小二乘法(二次函数)的系数。
但是、当我在 MATLAB 中进行相同的计算时、我得到了答案、但我似乎无法在 DSP 中计算它。
当我检查这些值时、这些值从一开始就存在差距。
是否可以消除这种差异?
请提供建议。

谢谢。


include "driverlib.h"
#include "device.h"
#include "math.h"

double x[100]、y[100];

void main (void)
{

int i=0;
双 x0=0、x1=0、x2=0、x3=0、x4=0、x2=0、x1y=0、x0y=0;

X[1]=2.01;y[1]=0.211;
X[2]=2.011;y[2]=0.238;
X[3]=2.012;y[3]=0.266;
X[4]=2.013;y[4]=0.295;
X[5]= 2.014;y[5]= 0.324;
X[6]= 2.015;y[6]= 0.354;
X[7]= 2.016;y[7]= 0.385;
X[8]=2.017;y[8]=0.416;
X[9]= 2.018;y[9]= 0.448;
X[10]= 2.019;y[10]= 0.481;
X[11]=2.02;y[11]=0.514;
X[12]=2.021;y[12]=0.549;
X[13]=2.022;y[13]=0.583;
X[14]=2.023;y[14]=0.619;
X[15]=2.024;y[15]=0.655;
X[16]=2.025;y[16]=0.692;
X[17]=2.026;y[17]=0.730;
X[18]=2.027;y[18]=0.768;
X[19]=2.028;y[19]=0.807;
X[20]=2.029;y[20]=0.847;
X[21]=2.03;y[21]=0.887;
X[22]=2.031;y[22]=0.928;
X[23]=2.032;y[23]=0.970;
X[24]=2.033;y[24]=1.013;
X[25]=2.034;y[25]=1.056;
X[26]=2.035;y[26]=1.100;
X[27]=2.036;y[27]=1.144;
X[28]=2.037;y[28]=1.190;
X[29]=2.038;y[29]=1.236;
X[30]=2.039;y[30]=1.282;
X[31]=2.04;y[31]=1.330;
X[32]=2.041;y[32]=1.378;
X[33]=2.042;y[33]=1.426;
X[34]=2.043;y[34]=1.476;
X[35]=2.044;y[35]=1.526;
X[36]=2.045;y[36]=1.577;
X[37]=2.046;y[37]=1.628;
X[38]=2.047;y[38]=1.681;
X[39]=2.048;y[39]=1.733;
X[40]=2.049;y[40]=1.787;
X[41]= 2.05;y[41]= 1.841;
X[42]=2.051;y[42]=1.896;
X[43]=2.052;y[43]=1.952;
X[44]=2.053;y[44]=2.008;
X[45]=2.054;y[45]=2.065;
X[46]=2.055;y[46]=2.123;
X[47]=2.056;y[47]=2.182;
X[48]=2.057;y[48]=2.241;
X[49]=2.058;y[49]=2.301;
X[50]=2.059;y[50]=2.361;


对于(i = 1;i <= 50;i++)
{
x0 = x0 + 1;
x1 = x1 + x[i];
X2 = x2 + pow (x[i]、2);
X3 = x3 + pow (x[i]、3);
x4 = x4 + pow (x[i]、4);

x2y=x2y+y[i]*pow (x[i]、2);
x1y=x1y+y[i]*x[i];
x0y = x0y + y[i];
}
//OK
双 A1、A2、A3、B1、B2、B3、A;

a1=x4*x2*x0;
a2=x3*x1*x2;
a3=x2*x1*x3;
b1=x2*x2*x2;
b2=x3*x3*x0;
B3=x4*x1*x1;
//OK
A=A1-B1+A2-B2+A3-B3;
//OK

逆行列 μ s
double g11、g12、g13、g21、g22、g23、g31、g32、g33;

G11=(x2*x0-x1*x1)/a;G12=-(x3*x0-x2*x1)/a;G13=(x3*x1-x2*x2)/a;
G21=-(x3*x0-x1*x2)/A;G22=(x4*x0-x2*x2)/A;G23=-(x4*x1-x2*x3)/A;
G31=(x3*x1-x2*x2)/a;G32=-(x4*x1-x3*x2)/a;G33=(x4*x2-x3*x3)/a;
//OK

最小二乗法 μ s
double p[10];
P[0]=g11*x2U+G12*x1y+G13*x0y;
P[1]=G21*x2U+G22*x1Y+G23*x0y;
P[2]=g31*x2U+G32*x1y+G33*x0y;



ESTOP0;
} 


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否提供有关问题的更多信息? 当您说一开始存在差距时、您指的是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。
    感谢你的答复。

    初始值在程序的第13行至第62行中以双精度类型给出。
    与寄存器值相比、从第四个十进制位置开始存在一个缺口。
    初始值中的间隙很小、但在计算反向决定因素时、它与 MATLAB 中的计算非常不同。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请参阅文章 浮点优化是否 有用。   

    正在使用哪个版本的编译器(而不是 CCS)?  请准确地显示编译选项、正如编译器看到的那样。  请复制并粘贴文本、不要使用屏幕截图。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。
    感谢你的答复。

    我手头没有 DSP、因此我稍后将验证该文章。

    我认为编译器是"C2000编译器"。
    我是初学者、不知道构建选项、所以我将在这里发布、尽管它可能有所不同。
    谢谢。

    谢谢你。

    ****为项目 gyoutretu2构建配置调试****

    "C:\\ti\\ccs1011\\ccs\\utils\\bin\\gmake"-k -j 8 all -O

    构建文件:"../Gyaku2.c"
    调用:C2000编译器
    "c:/ti/ccs1011/ccs/tools/compiler/bin/cl2000 /Users/watanabelab/new_workspace/gyouretu2/Debug /ti/ccs1011/ccs/tools/compiler/include -v28 -ml -mt --cla_support=cla1 -float_support=fpu32 -tmu_support=tmu0 -vcu_support=vcu2 -fp_mode=relaxed -include_path="c:/Users/watanabelab/new_workspace/gyouretu2 /Users/watanabelab/new_workspace/gyouretu2 -include_path="c:/Users/watanabelab/new_workspace/gyouretu2/device /ti/ccs1011/C2000Ware_3_03_00_00_Software/driverlib/f2837xd/driverlib -include_warnature=cyab_over-bothere-board-over-gui="-ce-board_guide-board_gui="-cn"-cn_guide-over-g_guide-over-ines=g_guide-over-ine-over-ine-board-cy_di_gui_gui_gui_gui_guide-ines=-ines=g_gui_guide-over-ines=-ine-over-g_gui_guide-over-ines=g_gui_guide-over-ines=g_gui_gui_guide-ines
    "./gyaku2.c"、第99行:警告#552-D:变量"p"已设置、但从未使用
    建筑完工:“./gyaku2.c”

    构建目标:"gyoutretu2.out"
    调用:C2000链接器
    "c:/ti/ccs1011/ccs/tools/compiler/bin/cl2000 /ti/ccs1011/ccs/tools/compiler/lib /device/F2837xD_CodeStartBranch.obj -v28 -ml -mt --cla_support=cla1 -float_support=fpu32 -tmu_support=tmu0 -vcu_support=vcu2 -fp_mode=relaxed -advice:performance=float=cpabi -g -diag_warn=225 -vcu_support=vcu-exclus-link_intrab-ine-ram_ram_model -rat_ram_ram_ram_un.ine-inese-info-model -link-ruline-ine-ine-ine-ine-ine-ov2-nat_remoti_remoti_remoti_remoti="-link_ove"-link_prise"-link_prisoti_pru2.pruat_ine-ine-ine-out.cpu2.premoti_remoti_pru2.pruate-ov.cpuate-ine-over-ine-over-ine-over-ine-over-ine-infot_remoti_remoti_remot /ti/ccs1011/C2000Ware_3_03_00_00_Software/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib /device/device.obj /ti/ccs1011/ccs/tools/compiler/include

    完成构建目标:"gyoutretu2.out"

    ****构建完成****

    -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 --fp_mode=relaxed --include_path="C:/Users/watanabelab/new_workspace/gyouretu2 /Users/watanabelab/new_workspace/gyouretu2 --include_path="C:/Users/watanabelab/new_workspace/gyouretu2/device /ti/ccs1011/C2000Ware_3_03_00_00_Software/driverlib/f2837xd/driverlib --include_display="cabi_support=/Users/watanabelab/new_workspace/gyouretu2/Debug /ti/ccs1011/ccs/tools/compiler/include --inflip_decure-ines=cabi="cove"--inate-display_ine-ine-cabi="***="-display_bi-display_bi-display_in="-cabi="-in="-cabi="-cabi="cove"--inate-in="-in="-in="-in="-in="-cabi="-cove-cove"--inaturbi-display_bi-display

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请将--fp_mode=relaxed 更改为--fp_mode=strict,并让我知道这是否解决了问题。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。
    感谢你的答复。

    我尝试过、但没有改变。

    谢谢你。

    ****为项目 gyoutretu4****构建配置调试

    "C:\\ti\\ccs1011\\ccs\\utils\\bin\\gmake"-k -j 8 all -O

    构建文件:"../Gyaku4.c"
    调用:C2000编译器
    "c:/ti/ccs1011/ccs/tools/compiler/bin/cl2000 /Users/watanabelab/new_workspace/gyouretu4 /Users/watanabelab/new_workspace/gyouretu4/Debug /Users/watanabelab/new_workspace/gyouretu4 /ti/ccs1011/ccs/tools/compiler/include -v28 -ml -mt --cla_support=cla1 --tmu_support=tmu0 -vcu_support=vcu2 -opt_for_speed=2 -fp_mode=strict -fp_reassoc=off -include_path="cus_path=vcu_path=-include_intrab_gui_gui="-cn_gui_guides=-/Users/watanabelab/new_workspace/gyouretu4/device /ti/ccs1011/C2000Ware_3_03_00_00_Software/driverlib/f2837xd/driverlib -cyakategintrab-ove-board-board_gui_gui_gui="-ines=-cn"-ecure-board_gui_gui_gui_guides=-ines=g_guide-over-ines=-cyakategines=trab-trab-trab-trab-ines=g_gui_gui_gui_gui_gui_gui_gui_gui_guides=-ines=-inese-ove.come"-ines=
    "./gyaku4.c"、第99行:警告#552-D:变量"p"已设置、但从未使用
    "./gyaku4.c"、第93行(第23列):建议#2615-D:(性能)使用--fp_mode=relaxed 启用 FP 分部的 TMU 硬件支持。
    建筑完工:“./gyaku4.c”

    构建目标:"gyoutretu4.out"
    调用:C2000链接器
    "c:/ti/ccs1011/ccs/tools/compiler/bin/cl2000 /ti/ccs1011/ccs/tools/compiler/lib /device/F2837xD_CodeStartBranch.obj -v28 -ml -mt --cla_support=cla1 --tmu_support=tmu0 --vcu_support=vcu2 --opt_for_speed=2 --fp_mode=strict --fp_reassoc=off --advice:performance=cpU1 -g --opt_for_speed=2-exclus-link_rom-link_ram_ram_ram_ram_ram_out-"-link_remote_remotion-out-"-link_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_infote_remote_remote_remote_remote_remote_remote_infote_remote_remote_remote_remote_remote_remote_remote_remote_remote_remote_infote_remote_remote_infote_remote_infote_remote_remote_remote_remote_remote_rem /ti/ccs1011/C2000Ware_3_03_00_00_Software/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib /device/device.obj /ti/ccs1011/ccs/tools/compiler/include

    完成构建目标:"gyoutretu4.out"

    ****构建完成****

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请按照 以下说明 确定编译器的版本、并让我知道它是什么。

    我对您的代码的理解不够好、无法确定下一步的重点。  请从您的代码中选择一个不正确的计算。  创建一个简单的测试用例。  此测试用例将一些变量设置为常数值、然后执行一次问题计算。  添加注释、以显示您期望从该计算中得到的结果、以及您得到的结果。  请注意、此测试用例不必运行、只需编译即可。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。
    非常感谢您的友好回复。

    编译器版本为"TI v20.8.0.STS"。

    经过一些测试、我发现在附加程序的第82行至第91行中产生了一个缺口。 当涉及到小数时、似乎往往会出现差距。 我认为这可能是由舍入误差引起的。

    有关与 MATLAB 的计算结果比较、请参阅以下注释。

    谢谢。


    #include "driverlib.h"
    #include "device.h"
    #include "math.h"
    double x[100]、y[100];
    void main (void)
      int i=0;
      双 x0=0、x1=0、x2=0、x3=0、x4=0、x2=0、x1y=0、x0y=0;
      X[1]=2.01    ;  y[1]=0.21081932   ;
      X[2]=  2.011  ;  y[2]=  0.23805511 ;
      X[3]=2.012    ;  y[3]=0.265984531  ;
      X[4]=2.013    ;  y[4]=0.294607584  ;
      X[5]=  2.014  ;  y[5]=  0.323924269;
      X[6]=  2.015  ;  y[6]=  0.353934585;
      X[7]=  2.016  ;  y[7]=  0.384638533;
      X[8]=  2.017  ;  y[8]=  0.416036113;
      X[9]=  2.018  ;  y[9]=  0.448127325;
      X[10]= 2.019  ;  y[10]= 0.480912168;
      X[11]=2.02   ;  y[11]=0.514390643 ;
      X[12]=2.021   ;  y[12]=0.548562749 ;
      X[13]=2.022   ;  y[13]=0.583428488 ;
      X[14]=2.023   ;  y[14]=0.618987858 ;
      X[15]=2.024   ;  y[15]=0.655240859 ;
      X[16]=2.025   ;  y[16]=0.692187493 ;
      X[17]=2.026   ;  y[17]=0.729827758 ;
      X[18]=2.027   ;  y[18]=0.768161655 ;
      X[19]=2.028   ;  y[19]=0.807189183 ;
      X[20]=2.029   ;  y[20]=0.8461010344 ;
      X[21]=2.03   ;  y[21]=0.887325135 ;
      X[22]=2.031   ;  y[22]=0.928433559 ;
      X[23]=2.032   ;  y[23]=0.970235614 ;
      X[24]=2.033   ;  y[24]=1.012731301 ;
      X[25]=2.034   ;  y[25]=1.05592062  ;
      X[26]=2.035   ;  y[26]=1.099803571 ;
      X[27]=2.036   ;  y[27]=1.144380153 ;
      X[28]=2.037   ;  y[28]=1.189650367 ;
      X[29]=2.038   ;  y[29]=1.235614212 ;
      X[30]=2.039   ;  y[30]=1.282271689 ;
      X[31]=2.04   ;  y[31]=1.329622798 ;
      X[32]=2.041   ;  y[32]=1.377667539 ;
      X[33]=2.042   ;  y[33]=1.426405911 ;
      X[34]=2.043   ;  y[34]=1.475837915 ;
      X[35]=2.044   ;  y[35]=1.525963551 ;
      X[36]=2.045   ;  y[36]=1.576782818 ;
      X[37]=2.046   ;  y[37]=1.628295718 ;
      X[38]=2.047   ;  y[38]=1.680502248 ;
      X[39]=2.048   ;  y[39]=1.733402411 ;
      X[40]=2.049   ;  y[40]=1.786996205 ;
      X[41]= 2.05  ;  y[41]= 1.841283631;
      X[42]=2.051   ;  y[42]=1.896264689 ;
      X[43]=2.052   ;  y[43]=1.951939378 ;
      X[44]=2.053   ;  y[44]=2.008307699 ;
      X[45]=2.054   ;  y[45]=2.065369652 ;
      X[46]=2.055   ;  y[46]=2.123125236 ;
      X[47]=2.056   ;  y[47]=2.181574452 ;
      X[48]=2.057   ;  y[48]=2.2407173   ;
      X[49]=2.058   ;  y[49]=2.30055378  ;
      X[50]=2.059   ;  y[50]=2.361083891 ;
      对于(i = 1;i <= 50;i++)
        {
          x0 = x0 + 1;
          x1 = x1 + x[i];
          X2 = x2 + pow (x[i]、2);
          X3 = x3 + pow (x[i]、3);
          x4 = x4 + pow (x[i]、4);
          x2y=x2y+y[i]*pow (x[i]、2);
          x1y=x1y+y[i]*x[i];
          x0y = x0y + y[i];
        }
      //OK
      //反转矩阵计算(3x3)
      //确定因素计算
      双 A1、A2、A3、B1、B2、B3、A;
      //              MATLAB        DSP
      a1=x4*x2*x0;      // a1=8867661.58111860  8867662.0
      a2=x3*x1*x2;      // a2=8866323.50134173  8866324.0
      a3=x2*x1*x3;      // A3=8866323.50134173  8866324.0
      b1=x2*x2*x2;      // B1=8865877.51064579  8865879.0
      b2=x3*x3*x0;      // b2=8867215.61736735  8867216.0
      B3=x4*x1*x1;      // B3=8867215.45578801  8867215.0
      //OK
      A=A1-B1+A2-B2+A3-B3; // A=9.03382897377014e-07  0.0
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //测试
      //#if 0
      a1=0、a2=0、a3=0、b1=0、b2=0、b3=0、a=0;
      x0=2、x1=4、x2=16、x3=34、x4=100;
      //              MATLAB DSP
       a1=x4*x2*x0;      // a1=3200  3200
       a2=x3*x1*x2;      // a2=21762176   
       a3=x2*x1*x3;      // A3=21762176   
       b1=x2*x2*x2;      // b1=4096  4096
       b2=x3*x3*x0;      // b2=2312  2312
       B3=x4*x1*x1;      // B3=1600  1600
       A=A1-B1+A2-B2+A3-B3; // A=-432-432   
       //OK
       a1=0、a2=0、a3=0、b1=0、b2=0、b3=0、a=0;
       x0=3、x1=6.80000000000000、x2=15.6000000000000、x3=36.224000000、x4=85.1232000000000;
       //              MATLAB DSP
       a1=x4*x2*x0;      // a1=3983.76576000000  3983.76611
       a2=x3*x1*x2;      // a2=3842.64192000000  3842.64185
       a3=x2*x1*x3;      // A3=3842.64192000000  3842.64185
       b1=x2*x2*x2;      // b1=3796.41600000000  3796.41626
       b2=x3*x3*x0;      // b2=3936.53452800000  3936.53418
       B3=x4*x1*x1;      // b3=3936.09676800000  3936.09692
       A=A1-B1+A2-B2+A3-B3; // A=0.002303999918518  0.00244140625
      //#endif
       //测试翅片
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //反矩阵
      double g11、g12、g13、g21、g22、g23、g31、g32、g33;
      G11=(x2*x0-x1*x1)/a;G12=-(x3*x0-x2*x1)/a;G13=(x3*x1-x2*x2)/a;
      G21=-(x3*x0-x1*x2)/A;G22=(x4*x0-x2*x2)/A;G23=-(x4*x1-x2*x3)/A;
      G31=(x3*x1-x2*x2)/a;G32=-(x4*x1-x3*x2)/a;G33=(x4*x2-x3*x3)/a;
    //最小方形方法
      double p[10];
      P[0]=g11*x2U+G12*x1y+G13*x0y;
      P[1]=G21*x2U+G22*x1Y+G23*x0y;
      P[2]=g31*x2U+G32*x1y+G33*x0y;
      ESTOP0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遗憾的是、该示例需要大量使用。  请提交与此更接近的内容...

    double bug_Demonstration (double arg1、double arg2)
    {
    /* arg1是2.0 */
    /* arg2为3.0 */
    双精度结果;
    
    结果= arg1 * arg2;
    /*预期结果为6.0,但为6.1。 而是计算*/
    
    返回结果;
    } 

    更改数字和计算以匹配您在代码中看到的问题之一。  但您的示例的一般形式和大小应与此示例相同。

    请告诉我 使用的编译器版本。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    include "driverlib.h"
    #include "device.h"
    #include "math.h"
    
    int main (void)
    {
    双精度 A1=0、A2=0、A3=0、B1=0、B2=0、B3=0、A=0;
    double x0=3、x1=6.8、x2=15.6、x3=36.224、x4=85.1232;
    
    // MATLAB DSP
    a1=x4*x2*x0; // a1=3983.76576000000 3983.76611
    a2=x3*x1*x2; // a2=3842.64192000000 3842.64185
    a3=x2*x1*x3; // A3=3842.64192000000 3842.64185
    b1=x2*x2*x2; // b1=3796.41600000000 3796.41626
    b2=x3*x3*x0; // b2=3936.53452800000 3936.53418
    B3=x4*x1*x1; // b3=3936.09676800000 3936.09692
    
    A=A1-B1+A2-B2+A3-B3;// A=0.002303999918518 0.00244140625
    
    返回0;
    }
    

    编译器版本为"TI v20.8.0.STS"。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请考虑改为将所有类型 double 计算更改为类型 long double。  这可以解决问题。  但它也需要更长的时间并使用更多的存储器。  请告诉我此建议是否解决了问题。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    通过将所有这些值更改为长双精度、计算的准确性得到了提高。 目标程序也是如此。
    很高兴看到目标程序更加精确。 如果您有任何建议、我想尝试一下。


    感谢您的友好建议!!





    include "driverlib.h" #include "device.h" #include "math.h" void main (void) { 长双精度 A1 = 0、A2 = 0、A3 = 0、B1 = 0、B2 = 0、B3 = 0、A = 0; 长双精度 x0=3、x1=6.8、x2=15.6、x3=36.224、x4=85.1232; // MATLAB DSP a1=x4*x2*x0; // a1=3983.76576000000 3983.7658322790521 a2=x3*x1*x2; // a2=3842.64192000000 3842.642018154294 a3=x2*x1*x3; // A3=3842.64192000000 3842.642018154294 b1=x2*x2*x2; // b1=3796.41600000000 3796.4162785034246 b2=x3*x3*x0; // b2=3936.53452800000 3936.5343157500029 B3=x4*x1*x1; // b3=3936.09676800000 3936.0969639731461 A=A1-B1+A2-B2+A3-B3;// A=0.002303999918518 0.0023103610665202723 ESTOP0; }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于 C2000、在 COFF 模式下、"double"是32位 IEEE 格式、"long double"是64位 IEEE 格式、因此 George 正确地建议您将变量更改为"long double"。  但是、您的常量仍然是"double"类型。  无后缀的浮点常量为"double"类型。  编译器首先将常量解析为"double"类型、然后将值转换为"long double"以初始化"long double"值。  通过向浮点常量中添加"L"后缀、可以获得更高的精度、如下所示:

    长双 x4 = 85.1232L;

    例如:

    #include 
    #include 
    
    void main()
    {
    long double double_constants_a;
    long double long_double_constants_a;
    
    {
    长双精度 A1 = 0、A2 = 0、A3 = 0、B1 = 0、B2 = 0、B3 = 0、A = 0;
    长双精度 x0=3、x1=6.8、x2=15.6、x3=36.224、x4=85.1232;
    
    a1=x4*x2*x0;
    a2=x3*x1*x2;
    a3=x2*x1*x3;
    b1=x2*x2*x2;
    b2=x3*x3*x0;
    B3=x4*x1*x1;
    
    A=A1-B1+A2-B2+A3-B3;
    
    double_constants_a = a;
    }
    
    {
    长双精度 A1 = 0、A2 = 0、A3 = 0、B1 = 0、B2 = 0、B3 = 0、A = 0;
    长双精度 x0=3、x1=6.8L、x2=15.6L、x3=36.224L、x4=85.1232L;
    
    a1=x4*x2*x0;
    a2=x3*x1*x2;
    a3=x2*x1*x3;
    b1=x2*x2*x2;
    b2=x3*x3*x0;
    B3=x4*x1*x1;
    
    A=A1-B1+A2-B2+A3-B3;
    
    long_double_constants_a = a;
    }
    
    printf ("没有后缀的双常量版本有%LE\n"错误
    "相对于带 L 后缀的长双精度常量\n"、
    fabsl (long_double_constants_a - double_constants_a)/long_double_constants_a);
    }
    

    带有无后缀双常量的版本相对于带有 L 后缀的长双常量具有2.760880e-03的错误

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    解决了!
    感谢您的帮助,非常有礼貌。