vs2008中方程演算的误差

时间:2014-10-13 10:07:16

标签: c++ visual-studio-2008 equation

我在C ++ VS2008-SP1中制作了以下简单代码:

    {
    double sum,sum1,x=0.5,k=0.12;
    sum=100.0;
    x=sqrt(1.0-k*x*x)+1.0;
    sum=sum-0.5*x;

    sum1=100.0;
    sum1=sum1-0.5*(sqrt(1.0-k*x*x)+1.0);
    printf("\n\n\nsum=%lg sum1=%lg",sum,sum1);
    }

结果:

sum=99.0076 sum1=99.1369

它发生在调试模式下以及在运行模式下执行.exe之后。

1 个答案:

答案 0 :(得分:1)

您在第一种情况下修改x,然后在第二种情况下再次使用它 - 将代码更改为:

{
    double sum,sum1,x=0.5,k=0.12;
    sum=100.0;
    x=sqrt(1.0-k*x*x)+1.0;
    sum=sum-0.5*x;

    x = 0.5; // <<< reset x to its initial value!!!
    sum1=100.0;
    sum1=sum1-0.5*(sqrt(1.0-k*x*x)+1.0);
    printf("\n\n\nsum=%lg sum1=%lg",sum,sum1);
}

或者您可以使用另一个变量作为临时值:

{
    double sum,sum1,x=0.5,k=0.12,y; // <<< use a different variable as a temporary
    sum=100.0;
    y=sqrt(1.0-k*x*x)+1.0;          // <<<
    sum=sum-0.5*y;                  // <<<

    sum1=100.0;
    sum1=sum1-0.5*(sqrt(1.0-k*x*x)+1.0);
    printf("\n\n\nsum=%lg sum1=%lg",sum,sum1);
}

无论哪种方式,这都给出了:

sum=99.0076 sum1=99.0076

正如所料。

请注意,单步执行调试器中的代码会使您的错误立即显而易见 - 如果您不知道如何执行此操作,那么现在是开始学习一些基本调试技能的好时机。