Если наличие субнормальных чисел не является обязательным (HAS_SUBNORM
макрос функций), то почему присутствие FP_SUBNORMAL
макроса классификации обязательно?
Причина вопроса: в на этот (до сих пор без ответа) вопрос был сделан вывод / предположение, что:
В случае, если HAS_SUBNORM равен 0, выполнение любой операции FP с входными данными, представленными вручную построенными субнормальными числами (построенными с использованием каламбура с помощью объединения, использования memcpy, чтения из файла и т. Д.), Приводит к неопределенному поведению ( UB).
Этот вывод / гипотеза приводит к нескольким вопросам:
- Означает ли это, что в случае
HAS_SUBNORM is 0
невозможно использовать стандартную библиотеку C для даже обнаружения наличия субнормальных чисел, предоставленных, например, пользователем?
Пример:
float value = get_value(); // user input
#if FLT_HAS_SUBNORM == 0
int class = fpclassify( value ); // leads to UB if value is subnormal number
if ( class == FP_SUBNORMAL )
{
error( "subnormal numbers are not supported" );
}
#endif
- Должно ли наличие
FP_SUBNORMAL
зависеть от дизъюнкции макросовHAS_SUBNORM
, установленных на1
? То есть:
#if FLT_HAS_SUBNORM == 1 || DBL_HAS_SUBNORM == 1 || LDBL_HAS_SUBNORM == 1
// FP_SUBNORMAL is present
#else
// FP_SUBNORMAL is absent
#endif
- Означает ли тот факт, что макрос классификации
FP_SUBNORMAL
является обязательным, что в случаеHAS_SUBNORM is 0
выполнение макросаfpclassify
с входными данными, представленными вручную построенными субнормальными числами, должно привести к четко определенному поведению?
UPD 20210527. По сравнению с режимами округления (C11, 7.6.8) (выделено мной):
Каждый из макросов FE_DOWNWARD ... определяется тогда и только тогда, когда реализация поддерживает получение и установку представленного направления округления с помощью функций fegetround и fesetround.
FP_SUBNORMAL
и пытается запустить его в системе, не поддерживающейHAS_SUBNORMAL
? Я бы по-прежнему хотел, чтобыfpclassify
работал и указывал, что мое тестовое значение не является субнормальным. - person Adrian Mole   schedule 26.02.2021FP_SUBNORMAL
во время выполнения такой кросс-платформенный код должен проверять, поддерживаются ли субнормальные числа, проверяяHAS_SUBNORMAL
во время компиляции. - person pmor   schedule 27.05.2021FP_SUBNORMAL
используется исключительно для проверки состояния. Это не вызывает субнормальной поддержки, просто проверяет ее. - person chux - Reinstate Monica   schedule 27.05.2021