LINUX.ORG.RU

SIGFPE


0

2

Первый раз такое встречаю — получил Float Point Exception c подкодом Inexact Result. Уважаемые эксперты, поясните пожалуйста суть этого исключения — у гугла непривычно скупая выдача по этому вопросу. Насколько я понимаю, этот тип ошибки связан с невозможностью для инструкции выдать неокругленный результат. Тогда почему этот эксепшн не вылезает на каждом шагу, например при попытке сохранить в double 2/3?

где-то кто-то (библиотека) замыл замаскировать назад вызов этого экспекшена. Вот и выпадает иногда.

mashina ★★★★★
()

если не изменяет память, это исключение почти не несет смысловой нагрузки - можно игнорировать

amomymous ★★★
()
Ответ на: комментарий от amomymous

* Я попробовал поставить SIG_IGN на SIGFPE, но результатов это не принесло.

* Пустой обработчик этого сигнала приводит к зацикливанию.

* Более того, я хочу игнорить не весь SIGFPE, а только подкод FPE_FLTRES (inexact result). Остальные коды, типа деления на ноль, вполне полезны.

* Из мана: According to POSIX, the behaviour of a process is undefined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by the kill() or the raise() functions. Integer division by zero has undefined result. On some architectures it will generate a SIGFPE signal. Ignoring this signal might lead to an endless loop.

* По непонятной мне причине в гугле об этом почти нет инфы, нету даже примеров кода в Google Codesearch. Видимо это очень редкая ситуция, что совсем уж странно.

j-a-t-a
() автор топика
Ответ на: комментарий от mashina

Я посмотрел, на момент краша в FP control word маска неточного результата _установлена_! А FP status word вообще чист.
Как такое может быть?

j-a-t-a
() автор топика

Разобрался, отвечаю сам себе и потенциальным несчастным, набредшим через гугл.
Этот вид исключения абсолютно нормален, но обычно замаскирован — в специальное поле управляющего слова (например, MXCSR для SSE) выставлена единица, поэтому процессор не поднимает исключения на уровень ОС, а сам разбирается с ситуацией.
А у меня включился этот эксепшн, потому что этот наш JIT забыл вернуть родное значение MXCSR.
Всем спасибо.

j-a-t-a
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.