数学ライブラリがない場合は、次の方法を使用して立方根を計算できます。
立方根
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 がちらつくので必要です。これらのアルゴリズムを変更して、4 乗根、5 乗根などを計算できます。
このアルゴリズムを教えてくれた 11 年生の数学教師 Herr Brenner に感謝しますsqrt
。
パフォーマンス
私は16mhzのクロック周波数を持つArduinoでそれをテストしました: