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 ++の実装は素晴らしいでしょうが、そうでない場合は、どのソリューションでも機能します。
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 ++の実装は素晴らしいでしょうが、そうでない場合は、どのソリューションでも機能します。
多分あなたは対数で何か悪いことをすることができます
多分あなたが大きな整数を扱うことを可能にするあなたが見つけることができるライブラリがあるでしょう
必要な精度によって異なります。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、HPF、VPIで独自のツールを作成しました)。