Если у вас когда-либо нет математической библиотеки, вы можете использовать этот способ для вычисления кубического корня:
кубического корня
double curt(double x) {
if (x == 0) {
// would otherwise return something like 4.257959840008151e-109
return 0;
}
double b = 1; // use any value except 0
double last_b_1 = 0;
double last_b_2 = 0;
while (last_b_1 != b && last_b_2 != b) {
last_b_1 = b;
// use (2 * b + x / b / b) / 3 for small numbers, as suggested by willywonka_dailyblah
b = (b + x / b / b) / 2;
last_b_2 = b;
// use (2 * b + x / b / b) / 3 for small numbers, as suggested by willywonka_dailyblah
b = (b + x / b / b) / 2;
}
return b;
}
Он получен из алгоритма sqrt
ниже.Идея состоит в том, что b
и x / b / b
больше и меньше от кубического корня x
.Таким образом, среднее значение обоих значений находится ближе к кубическому корню из x
.
Квадратный корень и Кубический корень (в Python)
def sqrt_2(a):
if a == 0:
return 0
b = 1
last_b = 0
while last_b != b:
last_b = b
b = (b + a / b) / 2
return b
def curt_2(a):
if a == 0:
return 0
b = a
last_b_1 = 0;
last_b_2 = 0;
while (last_b_1 != b and last_b_2 != b):
last_b_1 = b;
b = (b + a / b / b) / 2;
last_b_2 = b;
b = (b + a / b / b) / 2;
return b
В отличие от квадратного корня, last_b_1
и last_b_2
требуются в кубическом корне, потому что мигает b.Вы можете изменить эти алгоритмы для вычисления четвертого корня, пятого корня и т. Д.
Благодаря моему учителю математики г-ну Бреннеру в 11-м классе, который рассказал мне этот алгоритм для sqrt
.
производительности
Я тестировал его на Arduino с тактовой частотой 16 МГц: