【C语言】求一元二次方程ax²+bx+c=0 (b²-4ac>0即有实根)
时间: 2024-11-09 21:18:31 浏览: 13
Java Application和Applet两种方式求一元二次方程ax2+bx+c=0的根
5星 · 资源好评率100%
在C语言中,我们可以使用Bailout算法(也称为牛顿法或二分查找)来解一元二次方程 \( ax^2 + bx + c = 0 \)。当判别式 \( b^2 - 4ac > 0 \),意味着方程有两个实根。以下是基本步骤:
1. **计算判别式**:
首先,我们需要计算判别式 \( D = b^2 - 4ac \),判断是否有实数根。
2. **如果判别式大于0**:
a. **求两个根公式**:
- 使用公式 \( x_1 = \frac{-b + \sqrt{D}}{2a} \)
- 使用公式 \( x_2 = \frac{-b - \sqrt{D}}{2a} \)
3. **计算根**:
对每个公式,我们分别进行浮点数运算,因为可能存在除以零的情况,需要特别处理。
4. **避免精度问题**:
C语言本身对浮点数运算可能存在一定精度误差,可以使用库函数`sqrt()`和`fabs()`来处理接近于零的小数值。
5. **返回结果**:
将得到的解作为一对浮点数返回。
```c
#include <stdio.h>
#include <math.h>
// 函数原型声明
double quadratic_solver(double a, double b, double c);
int main() {
double a, b, c;
printf("Enter coefficients for the equation (ax^2 + bx + c = 0): ");
scanf("%lf %lf %lf", &a, &b, &c);
if (b * b - 4 * a * c > 0) {
double root1 = quadratic_solver(a, b, c);
double root2 = quadratic_solver(a, b, c); // 因为求两次是为了保证精确
printf("Roots are: %.2f and %.2f\n", root1, root2);
} else {
printf("The equation has no real roots.\n");
}
return 0;
}
// 实现解二次方程的函数
double quadratic_solver(double a, double b, double c) {
double discriminant = b * b - 4 * a * c;
double root1 = (-b + sqrt(discriminant)) / (2 * a);
double root2 = (-b - sqrt(discriminant)) / (2 * a);
return discriminant >= 0 ? root1 : TANH(root1); // 使用TANH处理非常小的负值
}
```
阅读全文