Вычисление в моем коде на C приводит к постепенному потере значимости, и когда это происходит, программа завершается с SIGFPE. Как я могу сбросить результат до нуля, когда в результате вычислений возникает постепенное недополнение (Denormal), а не прерывать выполнение? (Я работаю на Linux-машине с RedHat). Спасибо.
Сбрасывать в ноль, когда вычисление приводит к денормальному числу в Linux
Ответы (1)
Вы не указали архитектуру — я предполагаю, что это относительно недавний x86[-64], и в этом случае вы можете манипулировать управляющим регистром SSE, используя _mm_getcsr
, _mm_setcsr
, указанные в <xmmintrin.h>
(или <immintrin.h>
) заголовок.
Бит «flush-to-zero» установлен в 0x8000, а «denormals-are-zero» (для inputs/src) установлен в 0x0040.
_mm_setcsr(_mm_getcsr() | 0x8040);
или с <pmmintrin.h>
(SSE3):
_mm_setcsr(_mm_getcsr() | (_MM_FLUSH_ZERO_ON | _MM_DENORMALS_ZERO_ON));
Это может облегчить определение источника потери значимости, но это не следует рассматривать как решение, поскольку среда FP больше не соответствует стандарту IEEE-754.
person
Brett Hale
schedule
01.08.2013
gdb
и, когда программа получает SIGFPE, работают ли командыinfo float
иprint $mxcsr
? Каков их выход? Что получится, если вы выполните их в начале программы? (Используйтеbreak main
, затемrun
, затемinfo float
иprint $mxcsr
?) Когда возникает SIGFPE, можете ли вы выполнитьx/i $pc
, чтобы увидеть неисправную инструкцию, и можете ли вы распечатать содержимое операндов инструкции? - person Eric Postpischil   schedule 01.08.2013