ページ 1 / 1
c言語
Posted: 2015年11月06日(金) 02:29
by ykneu
[1] 質問文
[1.1] 自分が今行いたい事は何か:a^(n/m)をpow関数やexp関数を使わないで求めるプログラムを作りたい。(m,nは正の整数でaは非負の実数でともにキーボードから入力する)
[1.4] 今何がわからないのか、知りたいのか:a^nはforなどを使って表すことができるのはわかるが、a^(1/m)はどうあらわすのかわかりません。教えてもらえませんか?
[2] 環境
[2.2] コンパイラ名 : gcc
Re: c言語
Posted: 2015年11月06日(金) 07:01
by みけCAT
ykneu さんが書きました:a^nはforなどを使って表すことができるのはわかるが、a^(1/m)はどうあらわすのかわかりません。教えてもらえませんか?
a^(1/m)はaのm乗根なので、aやmが十分小さい(オーバーフローなどを考えない)場合は、例えば
0<=a<=1なら0~1、
1<=aなら1~a
を対象に二分探索をすれば求めることができます。
Re: c言語
Posted: 2015年11月06日(金) 19:22
by かずま
a
n は、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;
}