ここに初めて投稿します。この質問が受け入れられることを願っています。
小さなテストとして、反復と再帰の両方を使用して数値の階乗を計算するアプリケーションを作成しました。これは、24 より大きい数値の階乗を計算しようとする場合を除いて、うまく機能するように見えました。
たとえば、24 の階乗を計算すると、どちらの方法でも 62044840173323941 という正しい答えが得られます。
ただし、25 の階乗を計算すると、答えが異なります。再帰的方法では答えが 1.5511210043330986e+025 になり、反復方法では答えが 1.5511210043330984e+025 になります。
Wolfram Alpha によると、正解は反復法と同じはずですが、なぜ関数間の不一致が生じるのでしょうか? 同僚に尋ねたところ、彼らもその行動を説明できませんでした。
#define TEST_CASE 25
double GetFactorialRecursive(double i)
{
if (i == 1)
return i;
else
return i * GetFactorialRecursive(i - 1);
}
double GetFactorialIterative(double i)
{
double result = 1.0;
for (; i > 0; --i)
result *= i;
return result;
}
int main ()
{
double recres = 0, itrres = 0;
recres = GetFactorialRecursive(TEST_CASE);
itrres = GetFactorialIterative(TEST_CASE);
if (recres != itrres)
std::cout << "Error" << "\n";
std::cout << std::setprecision(25) << "Recursion: " << recres << ", Iteration: " << itrres << "\n";
return 0;
}
ご検討をお願いいたします。