Делает ли __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.

Другие вопросы по тегам