1
1
mirror of https://github.com/theoludwig/libcproject.git synced 2024-10-05 20:16:08 +02:00
libcproject/lib/mathematics.c
Théo LUDWIG 6ac47429e8
feat: use double instead of float for better precision
BREAKING CHANGE: Functions signatures changed
in the `mathematics` module.

BREAKING CHANGE: Renamed `MATHEMATICS_FLOAT_PRECISION` to `MATHEMATICS_DOUBLE_PRECISION`
2024-09-25 12:53:28 +02:00

71 lines
1.9 KiB
C

#include "mathematics.h"
bool mathematics_equals(const double number1, const double number2) {
return (number1 - number2) < MATHEMATICS_DOUBLE_PRECISION;
}
unsigned long long mathematics_absolute_value(const long long number) {
if (number >= 0) {
return number;
}
return -number;
}
unsigned long long mathematics_pow(unsigned long long base, unsigned long long exponent) {
return exponent == 0 ? 1 : base * mathematics_pow(base, exponent - 1);
}
double mathematics_root(double number, unsigned int nth_root) {
double result = number;
double previous_result = 0;
while (!mathematics_equals(result, previous_result)) {
result = (((nth_root - 1) * previous_result) + (number / mathematics_pow(result, nth_root - 1))) / nth_root;
previous_result = result;
}
return result;
}
double mathematics_square_root(double number) {
return mathematics_root(number, 2);
}
unsigned long long mathematics_factorial(unsigned long long number) {
return number == 0 ? 1 : number * mathematics_factorial(number - 1);
}
int64_t mathematics_opposite(int64_t number) {
return number * -1;
}
int64_t mathematics_max(int64_t number1, int64_t number2) {
return number1 > number2 ? number1 : number2;
}
int64_t mathematics_max_values(int64_t *values, size_t values_length) {
int64_t max = 0;
if (values_length <= 0) {
return max;
}
max = values[0];
for (size_t index = 1; index < values_length; index++) {
max = mathematics_max(max, values[index]);
}
return max;
}
int64_t mathematics_min(int64_t number1, int64_t number2) {
return number1 > number2 ? number2 : number1;
}
int64_t mathematics_min_values(int64_t *values, size_t values_length) {
int64_t min = 0;
if (values_length <= 0) {
return min;
}
min = values[0];
for (size_t index = 1; index < values_length; index++) {
min = mathematics_min(min, values[index]);
}
return min;
}