Собственная функция возведения в степень Си?

Не понимаю, как правильно реализовать, если у степени есть десятичная часть. Точнее я сделал это, но при 3х знаках после запятой у степени, там уже получается возведение в 1000 степень и на это тратится секунд 5. При 4х знаках после запятой уже ловлю seg fault.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#define s21_PI 3.141592654
#define eps 0.0000001
 
long double s21_pow(double base, double exp);
 
int main() {
    printf("%Lf\n", s21_pow(2, 2.999));
    printf("%f\n", pow(2, 2.999));
 
    return 0;
}
 
 
long double s21_pow(double base, double exp) {
    long double celoe = floor(fabs(exp));
    long double drob = fabs(exp) - celoe;
    long double znamenatel = 1;
 
    long double returnValue = 1.0;
    long double ValueDrob = 1.0;
    long double startX = 1;
    for (double i = 1; i <= celoe; i++) {
        returnValue = returnValue * base;
    }
    if (drob > eps) {
        long double znamenatel = 1;
        while ((drob) - floor(drob) > eps && (drob) - floor(drob) < 1 - eps){
            drob = drob * 10;
            znamenatel = znamenatel * 10;
        }
        while (fmod(drob, 2) < eps && fmod(znamenatel, 2) < eps) {
            drob = drob / 2;
            znamenatel = znamenatel / 2;
        }
        while (fmod(drob, 5) < eps && fmod(znamenatel, 5) < eps) {
            drob = drob / 5;
            znamenatel = znamenatel / 5;
        }
        long double forBase = s21_pow(base, drob);
        long double startX = forBase/znamenatel;
        long double oldX;
        bool end = false;
        while (!end) {
            oldX = startX;
            startX = 1/znamenatel * ((znamenatel - 1) * startX + forBase/s21_pow(startX, znamenatel - 1));
            if (!(oldX - startX > eps)) {
                end = true;
            }
        }
        returnValue = returnValue * startX;
    }
    if (exp < 0) {
        returnValue = 1/returnValue;
    } 
    if (fabs(exp) < eps) {
        returnValue = 1;
    }
    return returnValue;
}
  • Вопрос задан
  • 419 просмотров
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
У тебя - рекурсия. Попробуй расчитать какой она глубины.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы