Po raz pierwszy tutaj, mam nadzieję, że to pytanie jest do przyjęcia.Różne odpowiedzi podczas obliczania silni za pomocą iteracji i rekurencji
Jako mały test napisałem aplikację, która oblicza silnię liczby używając zarówno iteracji, jak i rekursji. To wydawało się działać dobrze z wyjątkiem, gdy próbuje obliczyć silnię dla numerów większy niż 24.
Na przykład podczas obliczania silni 24 obie metody dają właściwą odpowiedź 62044840173323941.
Podczas obliczania silni 25 jednak odpowiedzi różnią się. Metoda rekurencyjna podaje odpowiedź jako 1,5511210043330986e + 025, podczas gdy metoda iteracyjna daje odpowiedź jako 1,5511210043330984e + 025.
Zgodnie z Wolfram Alpha poprawna odpowiedź powinna być taka sama, jak metoda iteracyjna, więc dlaczego rozbieżności między funkcjami? Poprosiłem moich kolegów i oni również nie są w stanie wyjaśnić tego zachowania.
#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;
}
Dziękuję za uwagę.
Próbowałem tego sam. Ten sam wynik, również zauważalny, że te dwie liczby różnią się tylko o jeden bit: 'Rekursja: 15511210043330986055303168 [4529a940c33f6121]' i 'Iteracja: 15511210043330983907819520 [4529a940c33f6120]' – benzado