math.hを使わずにn乗根(ただしnは整数)を計算するためのC言語プログラム

数学の教育用の覚書。累乗根の近似値を具体的に計算する方法を習わずにn乗根を受け入れていたんだなあ - あらきけいすけの雑記帳の補遺。累乗根の計算でmath.hのpow()関数を使う部分が論点先取っぽくて気に入らなかったので、整数べきを計算する関数iPow()に書き換えた。iPow()はaのn乗をO(log(n))回程度の計算で実行する*1

#include <stdio.h>

double iPow (    // n乗の計算をする関数
    double base  // (base) の (power) 乗の近似値を求める
   ,int    power // べきは整数
) {
    double buff=1;
    do {
        if ( power & 1 ) buff*= base;
        power>>= 1;
        base*= base;
    } while ( power );
    return buff;
}

double calcNthRoot ( // n乗根の計算をする関数
    double base  // (base) の (1/order) 乗の近似値を求める
   ,int    order //
   ,double PREC  // 収束の精度
){
    double root=base ,rootPrev;
    do {
        rootPrev= root;
        root=((order-1)*root)/order + base/(order*iPow(root,order-1));
    } while ( (rootPrev-root)/root > PREC );
    return root;
}

int main ( int argc, char* argv[] ) {
    double base=3; // 3 の70乗根の計算
    int order=70;
    printf("%fの%d乗根は%f\n",base,order,calcNthRoot(base,order,1.e-10));
}

*1:参考文献: http://oshiete.goo.ne.jp/qa/3609014.html [2020.6.23追記]Alexander A. Stepanov, Daniel E. Rose, 株式会社クイープ (訳), 『その数式、プログラムできますか?』, (2015, 翔泳社), §2.1 エジプト乗法, p.9. によればiPow()の算法は"Egyptian multiplication", "Russian peasant algorithm"と呼ばれる。