Я получаю Floating point exception (core dumped)
ошибка в моей C ++ программе, и GDB показывает, что проблема в строке, которая выполняет деление по модулю:
Program received signal SIGFPE, Arithmetic exception.
[Switching to Thread 0x7ffff6804700 (LWP 13931)]
0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
at exp.cpp:55
55 return (r==0) ? 0 : l % r;
Линия защищает от деления на ноль, и моя обратная трассировка показывает следующее:
#0 0x00000000004023e8 in CompExp::eval (this=0x7fffec000e40, currVal=0)
at exp.cpp:55
l = -2147483648
r = -1
Поскольку я знаю, что делю не на ноль, что еще может быть причиной исключения?
Итак, я выяснил, в чем причина проблемы — арифметическое исключение может быть вызвано либо делением на ноль, либо переполнением подписанный целое число, которое здесь произошло. Целые числа без знака требуются для переноса при переполнении; поведение для целых чисел со знаком не определено.
Измените код на следующий, чтобы не пытаться взять по модулю отрицательное число, которое не определено:
return (r<=0) ? 0 : l % r;
Чтобы вычислить такое выражение по модулю: -2147483648 % -1
требуется разделение, которое в данном случае выглядит как 32-разрядное (я думаю, l
а также r
определяются как int
). Правильный результат такого разделения будет 2147483648
, но это значение не может быть представлено в 32-битном формате, поэтому создается арифметическое исключение.