2009-07-04 13 views
22

Dzisiaj szukałem wyjątku zmiennoprzecinkowego w kodzie, który właśnie napisałem. Trzeba było trochę czasu, aby znaleźć, ponieważ było to spowodowane przez pobranie liczby całkowitej mod zero. Oczywiście zrobienie czegokolwiek mod zero nie zostanie zdefiniowane, ale pomyślałem, że to dziwne, że błąd był tak mylący. Co to jest w ramach operatora modulo C++, który użyłby zmiennoprzecinkowego dla dwóch liczb całkowitych? (Używam gcc 4.3.2)Dlaczego% b wytwarza SIGFPE, gdy b wynosi zero?

Oto prosty program do wykazania błędu.

int main() 
{ 
    int a=3,b=0; 
    int c=a%b; 
    return 0; 
} 

Odpowiedz

33

operacja powoduje SIGFPE:

SIG jest wspólny przedrostek dla sygnału nazwami; FPE jest akronimem dla wyjątku zmiennoprzecinkowego . Chociaż SIGFPE niekoniecznie obejmuje arytmetykę zmiennoprzecinkową , nie ma sposobu na zmianę jej nazwy bez utraty kompatybilności wstecznej z .

GDB jest nieco jaśniejsze o tym i nazywa to "arytmetyczny wyjątek":

(gdb) run 
Starting program: /home/emil/float 

Program received signal SIGFPE, Arithmetic exception. 
0x0804837d in main() at float.c:4 
4   int c=a%b; 
9

Proszę spojrzeć na this page.

odpowiedniej części do Twojego pytania:

SIG jest wspólny przedrostek nazw sygnałowych; FPE jest akronimem dla wyjątku zmiennoprzecinkowego. Chociaż SIGFPE niekoniecznie obejmuje arytmetykę zmiennoprzecinkową, nie ma możliwości zmiany nazwy bez łamania wstecznej zgodności.

Powiązane problemy