为什么这个用于计算二次方程解的代码不起作用?

时间:2013-12-28 16:59:01

标签: c formula quadratic

每当我尝试运行它时,它会返回错误的解决方案,例如:
答:303
B:405
C:50

真正的解决方案:-0.13762776465722773
我的解决方案:-110079.531250

#include <stdio.h>
#include <math.h>
int main(){
    float a;
    float b;
    float c;
    float solution;
    float d;
    printf("A: ");
    scanf("%f", &a);
    printf("B: ");
    scanf("%f", &b);
    printf("C: ");
    scanf("%f",&c);
    d = b * b - 4 * a * c;
    solution = (-b - sqrt(d))/ 2*a;
    printf("%f", solution);
}

3 个答案:

答案 0 :(得分:6)

你忘记了BODMAS。将(-b - sqrt(d))/ 2*a替换为(-b - sqrt(d))/ (2*a)

答案 1 :(得分:2)

solution = (-b - sqrt(d))/ (2*a);

答案 2 :(得分:0)

两件事。

您需要注意操作顺序。

solution = (-b - sqrt(d)) / (2*a);

根据您的客户,您需要考虑结果的准确性。 有关详细信息,请参阅“Avoiding loss of significance

最后 - 我编写自己的程序版本时有点乐趣:

#include <stdio.h>
#include <math.h>

void printLineSolution( double a, double b, double c );

int main()
{
    printLineSolution(303,405,50);
    printLineSolution(1,2,0);
    printLineSolution(1,2,-1);
    printLineSolution(1,-2,-3);
    printLineSolution(1,-6,9);
    printLineSolution(1,3,3);
    getchar();
}

void printLineSolution( double a, double b, double c )
{
    double d = (b * b) - (4 * a * c);
    printf("(%lg)x^2 + (%lg)x + (%lg) = 0 ", a, b, c);
    if( a == 0 )
    {
        printf("=> not quadratic");
    }
    else
    {

        if( 0 > d )
        {
            double r = - b / (2*a);
            double i = sqrt( -d ) / (2*a);
            printf("=> 2 complex: %lg + %lgi ; %lg - %lgi", r, i, r, i);
        }
        else if ( 0 == d )
        {
            double solution = - b / (2*a);
            printf("=> 1 real: %lg", solution);
        }
        else
        {
            double s1 = (- b + sqrt( d ) ) / (2*a);
            double s2 = (- b - sqrt( d ) ) / (2*a);
            printf("=> 2 real: %lg ; %lg", s1, s2);
        }
    }
    printf("\n");
}