Алгоритм тетрации для работы с числами с плавающей запятой

Тетрация — это уровень выше возведения в степень (например: 2^^4 = 2^(2^(2^2)) = 65536.

Пока что я придумал работающий алгоритм тетрации.

Однако, хотя переменная a может быть с плавающей запятой или целым числом, к сожалению, переменная b должна быть целым числом.

Как я могу изменить алгоритм псевдокода, чтобы и a, и b могли быть числами с плавающей запятой, и был получен правильный ответ?

// Hyperoperation type 4:
public float tetrate(float a, float b)
{
    float total = a;
    for (i = 1; i < b; i++) total = pow(a, total);
    return total;
}

Пытаясь решить эту проблему, я создал свою собственную функцию power() (пытаясь избежать корней и функций журнала), а затем успешно обобщил ее на умножение. К сожалению, когда я затем пытаюсь обобщить до тетрации, числа приобретают грушевидную форму.

Я хотел бы, чтобы алгоритм был точным до x количества знаков после запятой, а не приближением, как говорит Википедия о. Чтобы уточнить, желательно, чтобы он должен был удовлетворять как минимум первым трем требованиям, а четвертое требование может быть до ответчика.


person Dan W    schedule 14.05.2015    source источник
comment
Итак, как именно рассчитывается 2^^1.7?   -  person Eugene Sh.    schedule 14.05.2015
comment
С логами и exp функциями конечно. :)   -  person Michael Dorgan    schedule 14.05.2015
comment
И с цифрами, наверное..   -  person Eugene Sh.    schedule 14.05.2015
comment
@Юджин Ш. Хмм Вики говорит, что нет общепринятого решения общей проблемы расширения тетрации на действительные или комплексные значения < i>n, Итак, OP, предложите опубликовать сообщение на math.stackexchange.com, чтобы получить алгоритм   -  person chux - Reinstate Monica    schedule 14.05.2015
comment
Таким образом, алгоритм не может быть точным до n знаков после запятой, потому что нет определения того, что является правильным результатом самой операции для реальных высот.   -  person Kolmar    schedule 14.05.2015
comment
Чтобы закрепить точку зрения, которую, как я думаю, пытаются сделать Юджин и Колмар, вам нужно сначала определить операцию, которую вы хотите выполнить (или принять чье-то определение), затем позаботиться об умных алгоритмах для ее вычисления. эффективно.   -  person Nicu Stiurca    schedule 15.05.2015
comment
Чтобы уточнить, желательно, чтобы он должен был удовлетворять хотя бы первым трем требованиям, и четвертое требование может быть до ответчика.   -  person Dan W    schedule 15.05.2015


Ответы (1)


base_num ^^ tetration_num =

e^( base_num * ln (e^(tetration_num * ln base_num)))

Натуральный логарифм можно рассчитать с помощью ряда Тейлора с любой необходимой вам точностью.

e^x также можно вычислить с любой необходимой вам точностью с помощью ряда Тейлора.

С некоторой заботой о переполнении/недостаточном заполнении вы сможете работать с любыми значениями, которые вам нужны, используя приведенное выше.

На всякий случай, если вам нужна серия, на этой странице перечислены те, вам понадобится. Закодировав что-то похожее на это в математике с фиксированной точкой (целые числа, без поплавков), я могу сказать, что это не так уж сложно запустить и запустить, но вам нужно быть осторожным с порядком, в котором вы делаете что-то, иначе вы числа быстро переполняются.


Обновить

Оказывается, мое выше работает только для некоторых тетраций, так как я не совсем понял, как работают тетрации. Глупый кролик.

person Michael Dorgan    schedule 14.05.2015
comment
Тетрация a^^x не (a^x)^a, как кажется из вашего ответа. Это a^(...^(a^(a^a))) с a повторениями x раз. - person Kolmar; 14.05.2015
comment
Тогда, во что бы то ни стало, я могу изменить свой ответ, но концепция, которую я показываю, все еще действительна - e ^ x - ln x можно использовать для обработки переменной точности. - person Michael Dorgan; 14.05.2015
comment
Это если у вас есть четко определенные возведения в степень. Но вы не можете выразить тетрацию с реальной высотой как комбинацию возведений в степень. (Это определение a^(...^(a^(a^a))) относится к естественному росту) - person Kolmar; 14.05.2015
comment
Ах. Я вижу сейчас. Интересный. Тогда мой ответ выше не сработает. Я обновлю свой ответ таким образом. - person Michael Dorgan; 14.05.2015