uaveiro-leci/2ano/1semestre/aed/aula02/polynomial.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;
}