Błąd SIGFPE

0

Witam!
Mam dziwny problem w zadaniu ze SPOJ, otóż działa ona na wszystkie sprawdzone przeze mnie sposoby, a ale gdy wysyłam kod wyskakuje mi błąd SIGFPE. Z wiki wiem, że jest to dzielenie przez zero, ale takie u mnie nie występuje. W kodzie mam jedno dzielenie które w żaden sposób nie może wyjść tak, żeby w liczniku pojawiło się 0.
Proszę o jakieś rady, co dalej. Korzystałem z debuggera i nic nie znalazłem.

 #include <iostream>
#include <iomanip>
using namespace std;

int t,n,k;
long double a,silniak=1;


int main()
{
    cin>>t;
    while(t)
    {
        cin>>n>>k;
        if(n<k)cout<<"0"<<endl;
        else
        {

            for(int i=1; i<=k; i++)
            {
                silniak=silniak*i;
            }
            a=n-k;
            a=a+1;

            for(int i=a+1;i<=n;i++)
            {
                a=a*i;
            }
            cout<<setprecision(10000);
            cout<<a/silniak<<endl;
        }
        silniak=1;
        t--;
    }
}
2

Prawdopodobnie wychodzisz poza zakres liczb long double.
Zadania na SPOJu wymagają wykazania się kreatywnością, a nie klepaniem kodu na pałę (zwłaszcza, gdy liczby wejściowe mogą sięgać kilkudziesięciu cyfr i masz z tego liczyć silnię).

Btw, dlaczego wykorzystałeś zmienne globalne?

0

SIGFPE może być efektem bardzo wielu problemów, nie tylko dzielenia przez zero. W manualu do fenv piszą jeszcze o:

     FE_DIVBYZERO      A divide-by-zero exception occurs when the exact result
                       of a computation is infinite (according to the limit
                       definition).  For example, dividing a finite non-zero
                       number by zero or computing log(0) raises a divide-by-
                       zero exception.

     FE_INEXACT        An inexact exception is raised whenever there is a loss
                       of accuracy due to rounding.

     FE_INVALID        Invalid operation exceptions occur when a program
                       attempts to perform calculations for which there is no
                       reasonable representable answer.  For instance,
                       subtraction of like-signed infinities, division of zero
                       by zero, ordered comparison involving NaNs, and taking
                       the real square root of a negative number are all
                       invalid operations.

     FE_OVERFLOW       In contrast with divide-by-zero, an overflow exception
                       occurs when an infinity is produced because the
                       magnitude of the exact result is finite but too large
                       to fit in the destination type.  For example, computing
                       DBL_MAX * 2 raises an overflow exception.

     FE_UNDERFLOW      Underflow occurs when the result of a computation loses
                       precision because it is too close to zero.  The result
                       is a subnormal number or zero.

Problem jest taki, że nie wiesz, jak SPOJ konfiguruje środowisko.

0

Poza zakres nie wychodze, bo w zadaniu jest napisane jakie moga byc maksymalne dane wejsciowe. Chodzi Ci o te zmienne wypisujace wynik? One chyba musza byc globalne, bo nie siegaly by za petle. Wyjasnij prosze dokladniej o co chodzi, bo jestem poczatkujacym programista C++ i jeszcze nie wiem co i jak.

0

Wrzuć link do zadania.

0
Lukasz132 napisał(a)

Chodzi Ci o te zmienne wypisujace wynik? One chyba musza byc globalne, bo nie siegaly by za petle.

Lokalność uzyskasz umieszczając je w funkcji main(), a nie w środku pętli.

1 użytkowników online, w tym zalogowanych: 0, gości: 1