Locandina prima volta qui, spero che questa domanda sia accettabile.Risposte diverse durante il calcolo fattoriale utilizzando l'iterazione e la ricorsione
Come piccolo test ho scritto un'applicazione che calcola il fattoriale di un numero utilizzando sia l'iterazione che la ricorsione. Questo sembrava funzionare bene, tranne quando si cerca di calcolare il fattoriale per i numeri maggiore di 24.
Per esempio, nel calcolo del fattoriale di 24 entrambi i metodi danno la risposta corretta di 62044840173323941.
Quando si calcola il fattoriale di 25 tuttavia, le risposte differiscono. Il metodo ricorsivo fornisce la risposta come 1.5511210043330986e + 025 mentre il metodo iterativo fornisce la risposta come 1.5511210043330984e + 025.
Secondo Wolfram Alpha la risposta corretta dovrebbe essere la stessa del metodo iterativo, quindi perché la discrepanza tra le funzioni? Ho chiesto ai miei colleghi e anche loro non sono in grado di spiegare il comportamento.
#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;
}
Grazie per la vostra considerazione.
L'ho provato io stesso. Stesso risultato, anche notevole che i due numeri differiscono solo di un bit: 'Ricorsione: 15511210043330986055303168 [4529a940c33f6121]' e 'Iterazione: 15511210043330983907819520 [4529a940c33f6120]' – benzado