[1] 質問文
[1.1] 自分が今行いたい事は何か:a^(n/m)をpow関数やexp関数を使わないで求めるプログラムを作りたい。(m,nは正の整数でaは非負の実数でともにキーボードから入力する)
[1.4] 今何がわからないのか、知りたいのか:a^nはforなどを使って表すことができるのはわかるが、a^(1/m)はどうあらわすのかわかりません。教えてもらえませんか?
[2] 環境
[2.2] コンパイラ名 : gcc
c言語
Re: c言語
a^(1/m)はaのm乗根なので、aやmが十分小さい(オーバーフローなどを考えない)場合は、例えばykneu さんが書きました:a^nはforなどを使って表すことができるのはわかるが、a^(1/m)はどうあらわすのかわかりません。教えてもらえませんか?
0<=a<=1なら0~1、
1<=aなら1~a
を対象に二分探索をすれば求めることができます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
かずま
Re: c言語
an は、for を使うよりも乗算回数を減らすことができます。
#include <stdio.h>
double pow1(double x, int n) // x^n
{
double y;
if (n == 0) return 1;
if (n == 1) return x;
if (x == 0) return 0;
if (x == 1) return 1;
y = pow1(x, n >> 1);
y *= y;
return (n & 1) ? y * x : y;
}
double pow2(double x, int n) // x^(1/n)
{
double a, b, m, y; int i;
if (n == 1) return x;
if (x == 0) return 0;
if (x == 1) return 1;
if (x < 1) a = x, b = 1;
else a = 1, b = x;
for (i = 0; i < 80; i++) {
m = (a + b) / 2;
y = pow1(m, n);
if (y == x) break;
if (y < x) a = m;
else b = m;
}
return m;
}
double pow3(double x, int n, int m) // x^(n/m)
{
return pow1(pow2(x, m), n);
}
int main()
{
double a; int n, m;
while (printf(">> "), scanf("%lf%d%d", &a, &n, &m) == 3)
printf("%.15g\n", pow3(a, n, m));
return 0;
}