Рассмотрим следующий код:
#include <fenv.h>
#include <stdio.h>
int main()
{
#pragma STDC FENV_ACCESS ON
1.0/0.0;
printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}
Я ожидал бы, что он напечатает ненулевое значение, соответствующее FE_DIVBYZERO
, но он напечатает 0. Изменение второй строки main
на double x = 1.0/0.0;
дает ожидаемое поведение. Это разрешено или это ошибка?
Редактировать: Поначалу может показаться, что в большинстве реальных программ операции, которые могут вызывать исключения fenv, не могут быть оптимизированы, поэтому можно безопасно выполнять большие вычисления и проверка в конце, произошло ли переполнение, деление на ноль и т. д. Тем не менее, все становится запутанным, и возникает реальная проблема, когда вы рассматриваете встраивание и оптимизацию. Если бы такая функция была встроена в ситуации, когда она всегда заканчивалась делением на ноль из-за постоянных аргументов, gcc мог бы получить действительно умных и оптимизировать всю встроенную функцию по существу до return INFINITY;
, не вызывая никаких исключений.