Files
42_EXT_05_computorv1/src/utils/math.c
2026-05-26 12:48:36 +02:00

84 lines
1.5 KiB
C

/* printer.c */
#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)
return false;
if (num < -DOUBLE_PRECISION)
return false;
return true;
}
const s_polynom *get_term_of_power(const s_polynom *polynom, int power)
{
int i;
i = 0;
while (polynom[i].sign != TERM_SIGN_END)
{
if (polynom[i].exponent == power)
break;
i++;
}
return &polynom[i];
}
double positiv_zero(double num)
{
if (is_nearly_equal_zero(num))
return 0.0;
return num;
}
bool has_decimal_part(double num)
{
return (!is_nearly_equal(num, (int)num));
}
bool any_has_decimal_part(double *num, size_t len)
{
while (len > 0)
{
if (has_decimal_part(num[len - 1]))
return true;
len--;
}
return false;
}
// find GCD of two integers using euclidean algorithm
int gcd_int(int a, int b)
{
int tmp;
while (b != 0)
{
tmp = b;
b = a % b;
a = tmp;
}
return ft_abs(a);
}
// returns the gcd, and modify arguments with new reduced values
int reduce_fraction(double *numerator, double *denominator)
{
int gcd;
if (any_has_decimal_part((double[]){*numerator, *denominator}, 2))
return 0;
gcd = gcd_int((int)*numerator, (int)*denominator);
*numerator /= gcd;
*denominator /= gcd;
return gcd;
}