1
given x=4 and y=1296;
we need to solve for z in z^x=y; 
we can calculate z=6 in various ways;

問題は、yが10 ^ 100を超える非常に大きな数である場合、どうすればzを見つけることができるかということです。明らかにその数をintとして格納できないので、zを計算するにはどうすればよいですか?

C ++の実装は素晴らしいでしょうが、そうでない場合は、どのソリューションでも機能します。

4

3 に答える 3

2

多分あなたは対数で何か悪いことをすることができます

多分あなたが大きな整数を扱うことを可能にするあなたが見つけることができるライブラリがあるでしょう

于 2012-10-14T01:43:30.873 に答える
2

ニュートン法を使用してみることができます。この場合、任意精度の算術演算を使用する必要があります。

つまり、任意精度の数値のクラスを作成する必要があります。これは、数字の配列で表される仮数と整数で表される指数の合成になります。鉛筆と紙の方法と同様の数字の基本的な操作を実現する必要があります。次に、wikiで説明されているニュートンのアルゴリズムを理解する必要があります。

于 2012-10-14T01:54:48.777 に答える
2

必要な精度によって異なります。1e100はdoubleで正確に表すことができないため、問題があります。

これは、正確な解決策が得られないことを受け入れても構わないと思っている場合に機能します。しかし、それでは、1e100はとにかくdoubleとして正確に表されていないというだけです。したがって、MATLABでは、

exp(log(1e100)/4)
ans =
                     1e+25

わかりました。1e25が答えのように見えますが、本当ですか?実際、doubleで実際に得られる数値は、10000000000000026675773440です。

1つの問題は、元の番号がとにかく正確に表されていないことです。したがって、1e100は、IEEE形式で保存されると、次のようにより正確に保存されます。

1.00000000000000001590289110975991804683608085639452813897813e100

これを正確に解決するには、大きな整数形式が最適ですが、大きな10進数形式でも十分に機能します。

したがって、MATLABでは、ビッグデシマル(HPF)形式を使用して、1e100が100桁の精度で正確に表されていることがわかります。

x = hpf('1e100',100)
x =
1.e100

そして、100桁の精度で、ルートは正しいです。

exp(log(x)/4)
ans =
10000000000000000000000000

ただし、実際には、浮動小数点形式では実数を正確に表すことができないため、注意が必要です。より正確に言うと、計算された数値は実際にはわずかに誤差があったことがわかります。

9999999999999999999999999.9999999999999999999999999999999999999999999999999999999999999999999999999999999999800

大きな整数形式が存在する場合、正確な結果が得られます。したがって、大きな整数形式を使用すると、期待される結果が得られます。

vpi(10)^100
ans =
    10000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000                                       

nthroot(vpi(10)^100,4)
ans =
    10000000000000000000000000

重要なのは、必要な計算を行うには、計算を実行できるツールを使用する必要があるということです。そのような大きな小数または大きな整数のツールがたくさんあります。たとえば、JavaにはBigDecimalとBigIntegerの形式があり、私は時々使用しています(とにかく、MATLAB、HPFVPIで独自のツールを作成しました)。

于 2012-10-14T01:59:00.977 に答える