pure quadratic is working

This commit is contained in:
hugogogo
2026-05-14 23:43:58 +02:00
parent 6c6accc289
commit aa78af4e0f
7 changed files with 83 additions and 39 deletions

View File

@@ -33,26 +33,42 @@ static void print_solution_pure_radicand_positiv(s_solution_degree_2_pure soluti
numerator = solution.numerator_sqrt;
denominator = solution.denominator_sqrt;
reduce_fraction(&numerator, &denominator);
printf("%g/%g\n", numerator, denominator);
printf("-%g/%g\n", numerator, denominator);
if (is_nearly_equal(denominator, 1))
{
printf("%g\n", numerator);
printf("-%g\n", numerator);
}
else
{
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);
printf("%g/√(%g)\n", solution.numerator_sqrt, solution.denominator);
printf("-%g/√(%g)\n", solution.numerator_sqrt, solution.denominator);
}
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);
printf("√(%g)/%g\n", solution.numerator, solution.denominator_sqrt);
printf("-√(%g)/%g\n", solution.numerator, solution.denominator_sqrt);
}
else
{
numerator = solution.numerator_sqrt;
denominator = solution.denominator_sqrt;
numerator = solution.numerator;
denominator = solution.denominator;
reduce_fraction(&numerator, &denominator);
printf("√(%g/%g)\n", numerator, denominator);
printf("-√(%g/%g)\n", numerator, denominator);
if (is_nearly_equal(denominator, 1))
{
printf("√(%g)\n", numerator);
printf("-√(%g)\n", numerator);
}
else
{
printf("√(%g/%g)\n", numerator, denominator);
printf("-√(%g/%g)\n", numerator, denominator);
}
}
}
@@ -67,26 +83,42 @@ static void print_solution_pure_radicand_negativ(s_solution_degree_2_pure soluti
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);
if (is_nearly_equal(denominator, 1))
{
printf("i%g\n", numerator);
printf("-i%g\n", numerator);
}
else
{
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);
printf("i%g/√(%g)\n", solution.numerator_sqrt, solution.denominator);
printf("-i%g/√(%g)\n", solution.numerator_sqrt, solution.denominator);
}
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);
printf("i√(%g)/%g\n", solution.numerator, solution.denominator_sqrt);
printf("-i√(%g)/%g\n", solution.numerator, solution.denominator_sqrt);
}
else
{
numerator = solution.a;
denominator = solution.c;
numerator = solution.numerator;
denominator = solution.denominator;
reduce_fraction(&numerator, &denominator);
printf("i√(%g/%g)\n", numerator, denominator);
printf("-i√(%g/%g)\n", numerator, denominator);
if (is_nearly_equal(denominator, 1))
{
printf("i√(%g)\n", numerator);
printf("-i√(%g)\n", numerator);
}
else
{
printf("i√(%g/%g)\n", numerator, denominator);
printf("-i√(%g/%g)\n", numerator, denominator);
}
}
}

View File

@@ -106,9 +106,11 @@ static void solve_degree_2_pure(s_solution_degree_2_pure *solution, double a, do
* SQARE ROOTS
*/
solution->numerator_sqrt = ft_sqrt(a, DOUBLE_PRECISION);
solution->numerator = ft_fabs(c);
solution->numerator_sqrt = ft_sqrt(ft_fabs(c), DOUBLE_PRECISION);
solution->numerator_sqrt_is_int = !has_decimal_part(solution->numerator_sqrt);
solution->denominator_sqrt = ft_sqrt(c, DOUBLE_PRECISION);
solution->denominator = ft_fabs(a);
solution->denominator_sqrt = ft_sqrt(ft_fabs(a), DOUBLE_PRECISION);
solution->denominator_sqrt_is_int = !has_decimal_part(solution->denominator_sqrt);
}

View File

@@ -101,10 +101,12 @@ static void print_context_solution()
dprintf(STDERR_FILENO, "radicand_absolute : %15g ( |r| )\n", solution_d2_pure.radicand_absolute);
dprintf(STDERR_FILENO, "radicand_sqrt : %15g ( √|r| )\n", solution_d2_pure.radicand_sqrt);
dprintf(STDERR_FILENO, "numerator_sqrt : %15g ( √a )\n", solution_d2_pure.numerator_sqrt);
dprintf(STDERR_FILENO, "numerator_sqrt_is_int : %15i ( false if √a is double )\n", solution_d2_pure.numerator_sqrt_is_int);
dprintf(STDERR_FILENO, "denominator_sqrt : %15g ( √c )\n", solution_d2_pure.denominator_sqrt);
dprintf(STDERR_FILENO, "denominator_sqrt_is_int: %15i ( false if √c is double )\n", solution_d2_pure.denominator_sqrt_is_int);
dprintf(STDERR_FILENO, "numerator : %15g ( |c| )\n", solution_d2_pure.numerator);
dprintf(STDERR_FILENO, "numerator_sqrt : %15g ( √c )\n", solution_d2_pure.numerator_sqrt);
dprintf(STDERR_FILENO, "numerator_sqrt_is_int : %15i ( false if √c is double )\n", solution_d2_pure.numerator_sqrt_is_int);
dprintf(STDERR_FILENO, "denominator : %15g ( |a| )\n", solution_d2_pure.denominator);
dprintf(STDERR_FILENO, "denominator_sqrt : %15g ( √a )\n", solution_d2_pure.denominator_sqrt);
dprintf(STDERR_FILENO, "denominator_sqrt_is_int: %15i ( false if √a is double )\n", solution_d2_pure.denominator_sqrt_is_int);
}
else
{

View File

@@ -2,6 +2,11 @@
#include "computorv1.h"
bool is_nearly_equal(double num, int compare)
{
return is_nearly_equal_zero(num - compare);
}
bool is_nearly_equal_zero(double num)
{
if (num > DOUBLE_PRECISION)
@@ -13,7 +18,7 @@ bool is_nearly_equal_zero(double num)
bool has_decimal_part(double num)
{
return (num != (int)num);
return (!is_nearly_equal(num, (int)num));
}
bool any_has_decimal_part(double *num, size_t len)