feraiseexcept: различное поведение между компиляторами и отсутствие документации для поведения, определяемого реализацией
Пример кода (t91.c):
#include <stdio.h>
#include <fenv.h>
#if _MSC_VER
#pragma fenv_access (on)
#else
#pragma STDC FENV_ACCESS ON
#endif
void show_fe_exceptions(void)
{
printf("exceptions raised:");
if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO");
if(fetestexcept(FE_INEXACT)) printf(" FE_INEXACT");
if(fetestexcept(FE_INVALID)) printf(" FE_INVALID");
if(fetestexcept(FE_OVERFLOW)) printf(" FE_OVERFLOW");
if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW");
if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none");
printf("\n");
}
int main(void)
{
feraiseexcept(FE_OVERFLOW);
show_fe_exceptions();
return 0;
}
Призывы:
$ clang t91.c -Wall -Wextra -pedantic && ./a.exe
t91.c:7:14: warning: pragma STDC FENV_ACCESS ON is not supported, ignoring pragma [-Wunknown-pragmas]
#pragma STDC FENV_ACCESS ON
^
1 warning generated.
exceptions raised: FE_OVERFLOW
$ gcc t91.c -Wall -Wextra -pedantic && ./a.exe
t91.c:7: warning: ignoring ‘#pragma STDC FENV_ACCESS’ [-Wunknown-pragmas]
7 | #pragma STDC FENV_ACCESS ON
|
exceptions raised: FE_OVERFLOW
$ cl t91.c /fp:strict && t91
exceptions raised: FE_INEXACT FE_OVERFLOW
ISO / IEC 9899:2011 (E):
7.6.2.2 Функция fegetexceptflag
Будет ли функция feraiseexcept дополнительно вызывать исключение «неточного» числа с плавающей запятой всякий раз, когда оно вызывает исключение «переполнение» или «недополнение» с плавающей запятой, определяется реализацией.
Однако документация для gcc и документация для Microsoft C не документируют (или я не могу ее найти) точное поведение
feraiseexcept
функция. Обратите внимание, что Clang / LLVM документирует свое поведение, определяемое реализацией, непосредственно через исходный код .
Также реализация , соответствующая стандарту ISO C, должна сопровождаться документом, в котором определены все характеристики, определяемые реализацией и локали, а также все расширения (ISO / IEC 9899:2011 (E), раздел 4, параграф 8).
Вопрос (наконец!): Почему реализации C не документируют все характеристики / поведение, определенные реализацией?