Не понимаю, как правильно реализовать, если у степени есть десятичная часть. Точнее я сделал это, но при 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;
}