私はmatlabを使い始めていて、言語の仕組みを学んでいます。nのような最大の自然数nを求めます。正確に計算されます
私はどのようにnのような最大の自然数nを見つけるかを試しています!正確に計算されます。私はMatlab関数階乗とintmaxを使用することが許されています。
私はMatlabバージョン2017aを使用しています。
感謝
私はmatlabを使い始めていて、言語の仕組みを学んでいます。nのような最大の自然数nを求めます。正確に計算されます
私はどのようにnのような最大の自然数nを見つけるかを試しています!正確に計算されます。私はMatlab関数階乗とintmaxを使用することが許されています。
私はMatlabバージョン2017aを使用しています。
感謝
考えられる解決策:
n=1;
Vec=[1];
IsAccurate=true;
while IsAccurate
n=n+1;
Vec(end+1)=n; %#ok<SAGROW>
Factorial=prod(Vec); %multiply all vector elements
IsAccurate=true;
for i=1:n %test if division of factorial by number give correct result
Number1=Factorial/Vec(i);
Number2=prod(Vec([1:i-1,i+1:n]));
Diff=Number1-Number2;
IsAccurate=IsAccurate & Diff==0;
end
end
disp(n)
技術的には、あなたもこれを解決するためにfactorial
かintmax
機能を使用する必要はありません。
total = uint64(1); % Set the data type you want here
N = 1;
while (total == (total*(N+1))/(N+1))
N = N+1;
total = total*N;
end
disp(N)
そして出力:
20 % Largest N for uint64 types that gives correct factorial(N)
これが原因のデータ・タイプは、彼らが表現できる数の大きさの上限を持っているという事実のために動作します。ここunsigned 64-bit integer typeのための例です。数値を大きくしすぎると、最大値であるinteger typesが飽和したり、精度がfloating-point types(精度に関するいくつかの興味深い関連情報here)になります。上記のループでは、階乗を最大でN
に格納して、を乗算してをN+1
に分割すると、最初の乗算でオーバーフロー/精度低下が発生した場合と同じ結果が得られません。
ありがとうございます。非常に役立ちます。 –
@Tom Jこれで質問に答えた場合は、回答としてマークしてください。 – jodag
スタックオーバーフローに参加してくれてありがとう! [How to ask](https://stackoverflow.com/help/how-to-ask)をご覧ください。 –
'factorial(n)<= intmax'のように' n'が最大になるのではないでしょうか?あなたは '' factorial(n) ''がintmaxよりも大きくなるまで計算を続けようとすることができます。 – jodag
実際には、大きな階乗は、乗算の2sと10sが非常に多いために、2進数と10進数の両方で多くの後続ゼロがあります。これらの値は、倍精度浮動小数点数としても正確に表現される可能性があります。したがって、MATLABではintmaxよりも大きないくつかの階乗を完全に表すことができます。 – jodag