add logic for pure quadratics
This commit is contained in:
@@ -2,12 +2,98 @@
|
||||
|
||||
#include "computorv1.h"
|
||||
|
||||
/**
|
||||
* DEGREE 1
|
||||
*/
|
||||
|
||||
static void print_solution_degree_1(s_solution_degree_1 solution)
|
||||
{
|
||||
ft_printf("The solution is:\n");
|
||||
printf("%g\n", solution.solution);
|
||||
}
|
||||
|
||||
/**
|
||||
* DEGREE 2 PURE
|
||||
*/
|
||||
|
||||
static void print_solution_pure_radicand_zero()
|
||||
{
|
||||
ft_printf("Radicant is equal to zero, the solution is:\n");
|
||||
printf("0\n");
|
||||
}
|
||||
|
||||
static void print_solution_pure_radicand_positiv(s_solution_degree_2_pure solution)
|
||||
{
|
||||
double numerator;
|
||||
double denominator;
|
||||
|
||||
ft_printf("Radicant is strictly positive, the two solutions are:\n");
|
||||
if (solution.numerator_sqrt_is_int && solution.denominator_sqrt_is_int)
|
||||
{
|
||||
numerator = solution.numerator_sqrt;
|
||||
denominator = solution.denominator_sqrt;
|
||||
reduce_fraction(&numerator, &denominator);
|
||||
printf("%g/%g\n", numerator, denominator);
|
||||
printf("-%g/%g\n", numerator, denominator);
|
||||
}
|
||||
else if (solution.numerator_sqrt_is_int)
|
||||
{
|
||||
printf("%g/√(%g)\n", solution.numerator_sqrt, solution.c);
|
||||
printf("-%g/√(%g)\n", solution.numerator_sqrt, solution.c);
|
||||
}
|
||||
else if (solution.denominator_sqrt_is_int)
|
||||
{
|
||||
printf("√(%g)/%g\n", solution.a, solution.denominator_sqrt);
|
||||
printf("-√(%g)/%g\n", solution.a, solution.denominator_sqrt);
|
||||
}
|
||||
else
|
||||
{
|
||||
numerator = solution.numerator_sqrt;
|
||||
denominator = solution.denominator_sqrt;
|
||||
reduce_fraction(&numerator, &denominator);
|
||||
printf("√(%g/%g)\n", numerator, denominator);
|
||||
printf("-√(%g/%g)\n", numerator, denominator);
|
||||
}
|
||||
}
|
||||
|
||||
static void print_solution_pure_radicand_negativ(s_solution_degree_2_pure solution)
|
||||
{
|
||||
double numerator;
|
||||
double denominator;
|
||||
|
||||
ft_printf("Radicant is strictly negative, the two complex solutions are:\n");
|
||||
if (solution.numerator_sqrt_is_int && solution.denominator_sqrt_is_int)
|
||||
{
|
||||
numerator = solution.numerator_sqrt;
|
||||
denominator = solution.denominator_sqrt;
|
||||
reduce_fraction(&numerator, &denominator);
|
||||
printf("i%g/%g\n", numerator, denominator);
|
||||
printf("-i%g/%g\n", numerator, denominator);
|
||||
}
|
||||
else if (solution.numerator_sqrt_is_int)
|
||||
{
|
||||
printf("i%g/√(%g)\n", solution.numerator_sqrt, solution.c);
|
||||
printf("-i%g/√(%g)\n", solution.numerator_sqrt, solution.c);
|
||||
}
|
||||
else if (solution.denominator_sqrt_is_int)
|
||||
{
|
||||
printf("i√(%g)/%g\n", solution.a, solution.denominator_sqrt);
|
||||
printf("-i√(%g)/%g\n", solution.a, solution.denominator_sqrt);
|
||||
}
|
||||
else
|
||||
{
|
||||
numerator = solution.a;
|
||||
denominator = solution.c;
|
||||
reduce_fraction(&numerator, &denominator);
|
||||
printf("i√(%g/%g)\n", numerator, denominator);
|
||||
printf("-i√(%g/%g)\n", numerator, denominator);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DEGREE 2
|
||||
*/
|
||||
|
||||
static void print_solution_delta_zero(s_solution_degree_2 solution)
|
||||
{
|
||||
ft_printf("Discriminant is equal to zero, the solution is:\n");
|
||||
@@ -59,7 +145,9 @@ static void print_solution_delta_negativ(s_solution_degree_2 solution)
|
||||
void print_solution(s_solution *solution)
|
||||
{
|
||||
s_solution_degree_2 solution_d2;
|
||||
s_solution_degree_2_pure solution_d2_pure;
|
||||
e_delta_sign delta_sign;
|
||||
e_radicand_sign radicand_sign;
|
||||
|
||||
// degree 1
|
||||
|
||||
@@ -67,7 +155,20 @@ void print_solution(s_solution *solution)
|
||||
{
|
||||
return print_solution_degree_1(solution->solution_degree_1);
|
||||
}
|
||||
else if (solution->degree == 2)
|
||||
else if (solution->degree == 2 && solution->is_quadratic_pure)
|
||||
{
|
||||
solution_d2_pure = solution->solution_degree_2_pure;
|
||||
radicand_sign = solution_d2_pure.radicand_sign;
|
||||
if (radicand_sign == RADICAND_ZERO)
|
||||
print_solution_pure_radicand_zero();
|
||||
else if (radicand_sign == RADICAND_PLUS)
|
||||
print_solution_pure_radicand_positiv(solution_d2_pure);
|
||||
else if (radicand_sign == RADICAND_MINUS)
|
||||
print_solution_pure_radicand_negativ(solution_d2_pure);
|
||||
else
|
||||
stop_errors("radicand sign is wrong : '%i' , radicand : '%g'", solution_d2_pure.radicand_sign, solution_d2_pure.radicand);
|
||||
}
|
||||
else if (solution->degree == 2 && !solution->is_quadratic_pure)
|
||||
{
|
||||
solution_d2 = solution->solution_degree_2;
|
||||
delta_sign = solution_d2.delta_sign;
|
||||
|
||||
Reference in New Issue
Block a user