Делает ли __builtin_isnan GCC что-то другое, кроме isnan?
В описании встроенных модулей GCC говорится:
GCC предоставляет встроенные версии макросов сравнения с плавающей запятой ISO C99, которые позволяют избежать возникновения исключений для неупорядоченных операндов. Они имеют те же имена, что и стандартные макросы (isgreater, isgreaterequal, isless, islessequal, islessgreater и isunordered) с префиксом _builtin . Мы хотим, чтобы разработчик библиотеки мог просто # определять каждый стандартный макрос до его встроенного эквивалента. Таким же образом GCC предоставляет встроенные функции fpclassify, isfinite, isinf_sign, isnormal и signbit, используемые с префиксом _builtin . Встроенные функции isinf и isnan появляются как со встроенным префиксом _, так и без него .
Итак, я не совсем могу это разобрать. Когда сравнения с плавающей запятой должны вызывать исключения? Соответствуют ли они стандарту C? Мандат они не делают? Ничего не требует? И - делает
__builtin_isnan()
действовать иначе, чем
isnan()
?
1 ответ
В качестве исключения здесь документы GCC относятся к исключениям с плавающей запятой IEEE 754 . Если вы сделаете что-то вроде
a < b
и одним из операндов является NaN, возникает исключение FP (недопустимое). Это означает, что бит в FPU будет оставаться установленным до тех пор, пока программист не очистит его явно. Вместо этого используя
isgreater
/
isless
/так далее. программист может избежать запуска исключения FP.