#include<stdio.h> #include<math.h> int main() { double n,p,ans; while(scanf("%lf %lf",&n,&p)==2) { ans=pow(p,(1/n)); printf("%.0lf\n",ans); } return 0; }
ここで ans を見つけるために使用されるアルゴリズムは何ですか。この pow() 関数の複雑さは何ですか?
#include<stdio.h> #include<math.h> int main() { double n,p,ans; while(scanf("%lf %lf",&n,&p)==2) { ans=pow(p,(1/n)); printf("%.0lf\n",ans); } return 0; }
ここで ans を見つけるために使用されるアルゴリズムは何ですか。この pow() 関数の複雑さは何ですか?
C99 標準のセクション 4.12.7.4 では、pow
関数について次のように述べています。
シノプシス
#include <math.h> double pow(double x, double y); float powf(float x, float y); long double powl(long double x, long double y);
説明
関数はを累乗して
pow
計算します。が有限かつ負であり、かつ有限で整数値でない場合、定義域エラーが発生します。範囲エラーが発生する場合があります。が 0 でが 0の場合、ドメイン エラーが発生する可能性があります。がゼロで、ゼロ未満の場合、定義域エラーまたは範囲エラーが発生する可能性があります。x
y
x
y
x
y
x
y
戻り値
pow
関数は [累乗x
] をy
返します。
関数の複雑さに関する情報は提供されておらず、使用されるアルゴリズムについては期待されていないことに注意してください。これは、関数が C の一部の実装ではプロセッサにネイティブである可能性があるためです。一方、他のアーキテクチャでは、浮動小数点処理はハードウェアによって提供されません。
ただし、複雑さはlog
、乗算、およびexp
組み合わせたものより悪くないと仮定できます。
double pow(double x, double y) {
return exp(log(x)*y);
}
FP ユニットを備えた多くのプラットフォームでは、基数 e のべき乗、浮動小数点の乗算、および自然対数はすべてO(1)
時間pow
がかかります。
exp
-edit2-との複雑さについてはよくわかりませんが、log
実装ではテイラー近似と一連のルックアップ テーブルを使用していると思います。それはまだ与えるでしょうO(1)
。
前の答えが言うように、言うことは不可能です。
fyl2x
x86 では、 (y *log2(x)) を計算し、f2xm1
命令 [+1.0 とともに]を使用して実装できます。
fld1 1.0
fld y
fld x
fyl2x // y * log2(x)
fadd // add 1.0
f2xm1 // 2 ^ (x-1)
次に、浮動小数点ユニットで exp/log 命令をまったくサポートしていない、またはほとんどサポートしていないプロセッサでは、log と exp はおそらく、入力値と方程式の良し悪しに応じて 5 ~ 20 回の反復を必要とする系列方程式を使用して計算されます。
その場合でも O(1) の複雑さは考慮されると思いますが、そのように機能しないシナリオを考え出すことができると確信しています。