61 lines
1.5 KiB
C
61 lines
1.5 KiB
C
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <math.h>
|
||
|
|
||
|
void display_pol(double* coef, size_t degree) {
|
||
|
if (coef == NULL) {
|
||
|
printf("NULL\n");
|
||
|
return;
|
||
|
}
|
||
|
for (size_t i = 0; i <= degree; i++) {
|
||
|
printf("%lf", coef[i]);
|
||
|
if (i < degree) {
|
||
|
printf(" * x^%lu + ", degree - i);
|
||
|
}
|
||
|
}
|
||
|
printf("\n");
|
||
|
}
|
||
|
|
||
|
double compute_pol(double* coef, size_t degree, double x) {
|
||
|
if (coef == NULL) {
|
||
|
return 0;
|
||
|
}
|
||
|
double result = 0;
|
||
|
for (size_t i = 0; i <= degree; i++) {
|
||
|
result += coef[i] * pow(x, degree - i);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
unsigned int get_real_roots(double* coef, size_t degree, double* root_1, double* root_2) {
|
||
|
if (coef == NULL || root_1 == NULL || root_2 == NULL || degree != 2 || coef[0] == 0) {
|
||
|
return 0;
|
||
|
}
|
||
|
double delta = pow(coef[1], 2) - 4 * coef[0] * coef[2];
|
||
|
if (delta < 0) {
|
||
|
*root_1 = 0;
|
||
|
*root_2 = 0;
|
||
|
return 0;
|
||
|
}
|
||
|
*root_1 = (-coef[1] - sqrt(delta)) / (2 * coef[0]);
|
||
|
*root_2 = (-coef[1] + sqrt(delta)) / (2 * coef[0]);
|
||
|
if (delta == 0) {
|
||
|
return 1;
|
||
|
}
|
||
|
return 2;
|
||
|
}
|
||
|
|
||
|
int main() {
|
||
|
double coef[] = {1, 2, 1};
|
||
|
size_t degree = 2;
|
||
|
double x = 1;
|
||
|
double root_1 = 0;
|
||
|
double root_2 = 0;
|
||
|
printf("Polynomial: ");
|
||
|
display_pol(coef, degree);
|
||
|
printf("f(%lf) = %lf\n", x, compute_pol(coef, degree, x));
|
||
|
printf("Number of real roots: %u\n", get_real_roots(coef, degree, &root_1, &root_2));
|
||
|
printf("Roots: %lf, %lf\n", root_1, root_2);
|
||
|
return 0;
|
||
|
}
|