Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does a%b produce SIGFPE when b is zero?

Tags:

c++

Today I was tracking down a floating point exception in some code I had just written. It took a little while to find because it was actually caused by taking an integer mod zero. Obviously doing anything mod zero is not going to be defined but I thought it was strange that the error was so misleading. What is it within the C++ modulo operator that would use floating point for two integers? (I'm using gcc 4.3.2)

Here's a simple program to demonstrate the error.

int main()
{
    int a=3,b=0;
    int c=a%b;
    return 0;
}
like image 628
orangejulius Avatar asked Jul 04 '09 01:07

orangejulius


People also ask

What is SIGFPE error?

The SIGFPE signal is raised when a computational error occurs. These errors include floating-point overflow, floating-point underflow, and either integer- or floating-point division by 0.

What is floating-point exception SIGFPE?

Floating-point exception when there is an error in floating-point arithmetic. Causes of floating-point exception include invalid operation and overflow. You cannot avoid floating-point errors, but you can manage them. SIGFPE is a signal raised by the floating-point exception.


2 Answers

The operation triggers SIGFPE:

SIG is a common prefix for signal names; FPE is an acronym for floating-point exception. Although SIGFPE does not necessarily involve floating-point arithmetic, there is no way to change its name without breaking backward compatibility.

GDB is a bit clearer about this and calls it "Arithmetic exception":

(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;
like image 146
Emil H Avatar answered Nov 10 '22 11:11

Emil H


Take a look at this page.

Relevant part for your question:

SIG is a common prefix for signal names; FPE is an acronym for floating-point exception. Although SIGFPE does not necessarily involve floating-point arithmetic, there is no way to change its name without breaking backward compatibility.

like image 9
arturh Avatar answered Nov 10 '22 09:11

arturh