Добавлены функции возведения в степень, экспоненты и логарифма для дуальных чисел, добавлены функции магнитуды для дуальных кватернионов

This commit is contained in:
Andrey Pokidov 2026-04-17 22:48:48 +07:00
parent 178e004e3f
commit cfb5fb7378
4 changed files with 121 additions and 0 deletions

View file

@ -448,4 +448,62 @@ inline void bgc_fp64_dual_number_interpolate(BGC_FP64_DualNumber* const interpol
interpolation->dual_part = first->dual_part * counter_phase + second->dual_part * phase;
}
// =================== Power ==================== //
inline void bgc_fp32_dual_number_power(BGC_FP32_DualNumber* const power, const BGC_FP32_DualNumber* const number, const float degree)
{
const float base = powf(number->real_part, degree - 1.0f);
power->real_part = base * number->real_part;
power->dual_part = base * number->dual_part * degree;
}
inline void bgc_fp64_dual_number_power(BGC_FP64_DualNumber* const power, const BGC_FP64_DualNumber* const number, const double degree)
{
const double base = pow(number->real_part, degree - 1.0);
power->real_part = base * number->real_part;
power->dual_part = base * number->dual_part * degree;
}
// ================== Exponent ================== //
inline void bgc_fp32_dual_number_exponent(BGC_FP32_DualNumber* const exponent, const BGC_FP32_DualNumber* const degree)
{
exponent->real_part = expf(degree->real_part);
exponent->dual_part = exponent->real_part * degree->dual_part;
}
inline void bgc_fp64_dual_number_exponent(BGC_FP64_DualNumber* const exponent, const BGC_FP64_DualNumber* const degree)
{
exponent->real_part = exp(degree->real_part);
exponent->dual_part = exponent->real_part * degree->dual_part;
}
// ============= Natural Logarithm ============== //
inline int bgc_fp32_dual_number_ln(BGC_FP32_DualNumber* const logarithm, const BGC_FP32_DualNumber* const number)
{
if (number->real_part <= 0.0f) {
return BGC_FAILURE;
}
logarithm->real_part = logf(number->real_part);
logarithm->dual_part = logarithm->real_part * number->dual_part / number->real_part;
return BGC_SUCCESS;
}
inline int bgc_fp64_dual_number_ln(BGC_FP64_DualNumber* const logarithm, const BGC_FP64_DualNumber* const number)
{
if (number->real_part <= 0.0) {
return BGC_FAILURE;
}
logarithm->real_part = log(number->real_part);
logarithm->dual_part = logarithm->real_part * number->dual_part / number->real_part;
return BGC_SUCCESS;
}
#endif