大きな数の n 乗根 (に収まらない数) を取ることができる C++ ライブラリはありunsigned long long
ますか?
6367 次
6 に答える
10
人気のあるオープン ソースの任意精度数学ライブラリであるGMPを使用できます。C++ バインディングがあります。
于 2010-04-08T05:33:52.850 に答える
3
これを自分でコーディングしたい場合は、ウィキペディアの n 乗根に関するページを参照してください。
http://en.wikipedia.org/wiki/Nth_root
反復アルゴリズムは非常に単純です。
数値 A の n 乗根は、ニュートン法の特殊なケースである n 乗根アルゴリズムによって計算できます。初期推定 x(0) から開始し、再帰関係を使用して反復します
x(k+1) = [(n - 1) * x(k) + A / x(k)^(n - 1)] / n
目的の精度に収束したら停止します。
于 2010-04-08T05:50:40.610 に答える
2
2^64 よりどれだけ大きくしたいかによりますね。doubles を使用するだけで、10^9 の約 1 分の 1 に収まります。Cでテストプログラムを書きました:
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
unsigned long long x;
double dx;
int i;
//make x the max possible value
x = ~0ULL;
dx = (double)x;
printf("Starting with dx = %f\n", dx);
//print the 2th to 20th roots
for (i = 2; i < 21; i++)
{
printf("%dth root %.15f\n", i, pow(dx, 1.0/i));
}
return 0;
}
次の出力が生成されました。
Starting with dx = 18446744073709551616.000000
2th root 4294967296.000000000000000
3th root 2642245.949629130773246
4th root 65536.000000000000000
5th root 7131.550214521852467
6th root 1625.498677215435691
7th root 565.293831000991759
8th root 256.000000000000000
9th root 138.247646578215154
10th root 84.448506289465257
11th root 56.421840319745364
12th root 40.317473596635935
13th root 30.338480458853493
14th root 23.775908626191171
15th root 19.248400577313866
16th root 16.000000000000000
17th root 13.592188707483222
18th root 11.757875938204789
19th root 10.327513583579238
20th root 9.189586839976281
次に、ルートごとにWolfram Alphaと比較して、上記で引用したエラーを取得しました。
アプリケーションによっては、おそらくこれで十分です。
于 2010-04-08T07:29:50.217 に答える
-1
長除法は、正の実数の n 乗根を計算する最適な方法です。計算された各桁の最高の精度が得られます。初期推定も反復近似も必要ありません。
于 2016-02-17T11:08:01.143 に答える