C 当系数可能为0时,求解二次方程
我遇到了一个问题,需要编写一个C程序来求解方程ax2+bx+C=0,其中a、b和C是双C 当系数可能为0时,求解二次方程,c,floating-point,double,C,Floating Point,Double,我遇到了一个问题,需要编写一个C程序来求解方程ax2+bx+C=0,其中a、b和C是双类型的系数。任何系数都可以是零。在这个问题中,我不清楚如何处理double变量 这是我的密码。至于现在,我知道我的程序不能区分两个根和无限多个根。它也不检测“线性方程情况”。我怎样才能让它检测到无限多的解决方案?我在评论中也被建议,如果b>0,在判别式之前用减号计算根,然后使用越南定理。我明白这是因为两个数字相加总是更准确。我也猜我应该做与b
类型的系数。任何系数都可以是零。在这个问题中,我不清楚如何处理double
变量
这是我的密码。至于现在,我知道我的程序不能区分两个根和无限多个根。它也不检测“线性方程情况”。我怎样才能让它检测到无限多的解决方案?我在评论中也被建议,如果b>0,在判别式之前用减号计算根,然后使用越南定理。我明白这是因为两个数字相加总是更准确。我也猜我应该做与b<0完全相反的事情。但是如果b==0呢?在这种情况下,程序将不会执行任何操作。或者我应该在b<0中包含b==0,并且有b DBL_EPSILON)&(fabs((a*x2*x2+b*x2+c))>DBL_EPSILON))//如果两个插入根都不满足方程
printf(“否”);
}
}
返回0;
}
由于不允许被零除,您必须将问题分为4种情况:
编辑:与删除的epsilon进行比较,因为它们似乎没有用由于不允许被零除,您必须将问题分为4种情况:
编辑:与epsilon的比较已删除,因为它们似乎无用代码中存在一些问题:
- 您应该检查
的返回值,以避免在无效输入上出现未定义的行为scanf()
- 您应该为中间结果使用局部变量,以提高代码可读性
- 您的
语句不正确:您应该传递双变量的值,而不是它们的地址:printf
printf(“%lf”,&x1)代码>应为:
printf("%f", x1);
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, delta, x1, x2;
if (scanf("%lf%lf%lf", &a, &b, &c) != 3) {
printf("invalid input\n");
return 1;
}
if (a == 0) {
// not a quadratic equation
if (b != 0) {
printf("one solution: %g\n", -c / b);
} else {
if (c != 0) {
printf("no solution\n");
} else {
printf("all real values are solutions\n");
}
}
} else {
delta = b * b - 4 * a * c;
if (delta < 0) {
printf("no real solution\n");
} else
if (delta == 0) {
printf("one double solution: %g\n", -b / (2 * a));
} else {
x1 = (-b + sqrt(delta)) / (2 * a);
x2 = (-b - sqrt(delta)) / (2 * a);
printf("two solutions: %g, %g\n", x1, x2);
}
}
return 0;
}
#包括
#包括
int main(){
双a,b,c,δ,x1,x2;
如果(扫描频率(“%lf%lf%lf”、&a、&b和&c)!=3){
printf(“无效输入\n”);
返回1;
}
如果(a==0){
//不是二次方程
如果(b!=0){
printf(“一个解决方案:%g\n”,-c/b);
}否则{
如果(c!=0){
printf(“无解决方案”);
}否则{
printf(“所有实际值都是解决方案\n”);
}
}
}否则{
δ=b*b-4*a*c;
if(δ<0){
printf(“没有真正的解决方案”\n);
}否则
如果(增量==0){
printf(“一个双溶液:%g\n”,-b/(2*a));
}否则{
x1=(-b+sqrt(δ))/(2*a);
x2=(-b-平方比(δ))/(2*a);
printf(“两种解决方案:%g,%g\n”,x1,x2);
}
}
返回0;
}
您的代码中存在一些问题:
- 您应该检查
的返回值,以避免在无效输入上出现未定义的行为scanf()
- 您应该为中间结果使用局部变量,以提高代码可读性
- 您的
语句不正确:您应该传递双变量的值,而不是它们的地址:printf
printf(“%lf”,&x1)代码>应为:
printf("%f", x1);
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, delta, x1, x2;
if (scanf("%lf%lf%lf", &a, &b, &c) != 3) {
printf("invalid input\n");
return 1;
}
if (a == 0) {
// not a quadratic equation
if (b != 0) {
printf("one solution: %g\n", -c / b);
} else {
if (c != 0) {
printf("no solution\n");
} else {
printf("all real values are solutions\n");
}
}
} else {
delta = b * b - 4 * a * c;
if (delta < 0) {
printf("no real solution\n");
} else
if (delta == 0) {
printf("one double solution: %g\n", -b / (2 * a));
} else {
x1 = (-b + sqrt(delta)) / (2 * a);
x2 = (-b - sqrt(delta)) / (2 * a);
printf("two solutions: %g, %g\n", x1, x2);
}
}
return 0;
}
#包括
#包括
int main(){
双a,b,c,δ,x1,x2;
如果(扫描频率(“%lf%lf%lf”、&a、&b和&c)!=3){
printf(“无效输入\n”);
返回1;
}
如果(a==0){
//不是二次方程
如果(b!=0){
printf(“一个解决方案:%g\n”,-c/b);
}否则{
如果(c!=0){
printf(“无解决方案”);
}否则{
printf(“所有实际值都是解决方案\n”);
}
}
}否则{
δ=b*b-4*a*c;
if(δ<0){
printf(“没有真正的解决方案”\n);
}否则
如果(增量==0){
printf(“一个双溶液:%g\n”,-b/(2*a));
}否则{
x1=(-b+sqrt(δ))/(2*a);
x2=(-b-平方比(δ))/(2*a);
printf(“两种解决方案:%g,%g\n”,x1,x2);
}
}
返回0;
}
当系数可能为0时,求解二次方程
我怎样才能让它检测到无限多的解决方案
当a==0&&b==0&&c==0
时
在这段代码的任何地方都不需要DBL_EPSILON。另见
但是如果b==0呢
或者我应该在b<0中包含b==0,当系数可能为0时,让b解二次方程吗
我如何才能使它检测到无限数量的解
当a==0&&b==0&&c==0
时
在这段代码的任何地方都不需要DBL_EPSILON。另见
但是如果b==0呢
或者我应该在b<0和
if (a==0) {
if (b == 0) {
if ((b * b - 4 * a * c) < 0)
//
if (b * b < 4 * a * c)
//if ((b * b - 4 * a * c) < 0) {
// printf("no");
//} else {
// x1 = (-b + sqrt(b * b - 4 * a * c))
double discriminate = b * b - 4 * a * c;
if (discriminate < 0) {
printf("no");
} else {
double d = sqrt(discriminate);
x1 = (-b + d)
double d = sqrt(discriminate);
// Note x1*x2 = c/a
if (b < 0) {
x2 = (-b + d)/(2*a);
x1 = c/a/x2;
} else {
x1 = (-b - d)/(2*a);
x2 = c/a/x1;
}
printf_roots("2 roots", x1, x2);
printf("%g\n", some_double);
// or better
printf("%.*e\n", DBL_DECIMAL_DIG -1, some_double);