Если наличие субнормальных чисел необязательно (HAS_SUBNORM), то почему присутствие FP_SUBNORMAL обязательно?

Если наличие субнормальных чисел не является обязательным (HAS_SUBNORM макрос функций), то почему присутствие FP_SUBNORMAL макроса классификации обязательно?

Причина вопроса: в на этот (до сих пор без ответа) вопрос был сделан вывод / предположение, что:

В случае, если HAS_SUBNORM равен 0, выполнение любой операции FP с входными данными, представленными вручную построенными субнормальными числами (построенными с использованием каламбура с помощью объединения, использования memcpy, чтения из файла и т. Д.), Приводит к неопределенному поведению ( UB).

Этот вывод / гипотеза приводит к нескольким вопросам:

  1. Означает ли это, что в случае 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
  1. Должно ли наличие 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
  1. Означает ли тот факт, что макрос классификации FP_SUBNORMAL является обязательным, что в случае HAS_SUBNORM is 0 выполнение макроса fpclassify с входными данными, представленными вручную построенными субнормальными числами, должно привести к четко определенному поведению?

UPD 20210527. По сравнению с режимами округления (C11, 7.6.8) (выделено мной):

Каждый из макросов FE_DOWNWARD ... определяется тогда и только тогда, когда реализация поддерживает получение и установку представленного направления округления с помощью функций fegetround и fesetround.


person pmor    schedule 26.02.2021    source источник
comment
Что делать, если у меня есть кросс-платформенный код, который проверяет FP_SUBNORMAL и пытается запустить его в системе, не поддерживающей HAS_SUBNORMAL? Я бы по-прежнему хотел, чтобы fpclassify работал и указывал, что мое тестовое значение не является субнормальным.   -  person Adrian Mole    schedule 26.02.2021
comment
3. Как можно вручную построить субнормальное число, если они не поддерживаются?   -  person Ian Abbott    schedule 26.02.2021
comment
@IanAbbott: записать в байты, представляющие объект с плавающей запятой, через указатели на тип символа.   -  person Eric Postpischil    schedule 26.02.2021
comment
Прочтите число с плавающей запятой из двоичного файла, созданного в системе, которая поддерживает субнормальные значения.   -  person stark    schedule 26.02.2021
comment
@EricPostpischil Ну да, но вы можете записать любое старое нежелательное значение, используя этот метод. Вы не можете записать четко определенное субнормальное значение, если четко определенных субнормальных значений не существует.   -  person Ian Abbott    schedule 26.02.2021
comment
@IanAbbott: В спецификации с плавающей запятой могут быть определены субнормальные значения без определения операций с этими значениями. Стандарт C определяет число с плавающей запятой как знак, умноженный на основание, возведенное в степень, умноженную на число с фиксированным количеством цифр в базе, и классифицирует нормализованные числа как те, которые начинаются с ненулевой цифры. кроме случаев, когда все они нули, и субнормальными числами должны быть числа, начинающиеся с нулевой цифры (но не все нули) и минимального показателя степени. Таким образом, модель содержит субнормальные числа, но не требует их подтверждения.   -  person Eric Postpischil    schedule 26.02.2021
comment
@EricPostpischil Если реализация не поддерживает субнормальные значения, но формат двоичного представления поддерживает их, реализация будет интерпретировать битовый шаблон предполагаемого субнормального числа в соответствии со своими собственными правилами. Например, он может рассматривать все предполагаемые субнормальные числа как представление числа 0.   -  person Ian Abbott    schedule 26.02.2021
comment
@IanAbbott: Конечно.   -  person Eric Postpischil    schedule 26.02.2021
comment
@AdrianMole Что делать, если у меня есть кросс-платформенный код, который проверяет FP_SUBNORMAL: перед тестированием на FP_SUBNORMAL во время выполнения такой кросс-платформенный код должен проверять, поддерживаются ли субнормальные числа, проверяя HAS_SUBNORMAL во время компиляции.   -  person pmor    schedule 27.05.2021
comment
@pmor код должен проверять, поддерживаются ли субнормальные числа, это больше похоже на может проверять (да, это возможно), а не на должно. Наличие макроса классификации FP_SUBNORMAL, даже когда субнормальные числа не являются обязательными, упрощает кодирование. В целом, язык можно было определить так, как вы подразумеваете, но это не так.   -  person chux - Reinstate Monica    schedule 27.05.2021
comment
@ chux-ReinstateMonica Меня смущает отсутствие согласованности, например, с макросами режима округления, которые определены тогда и только тогда, когда реализация поддерживает получение и установку представленного направления округления (C11, 7.6. 8). Что ясно и логично: зачем требовать некоторых определений, связанных с функциями, если функция вообще не поддерживается?   -  person pmor    schedule 27.05.2021
comment
Для ввода используются режимы округления - для изменения функциональности. Они направляют режим. FP_SUBNORMAL используется исключительно для проверки состояния. Это не вызывает субнормальной поддержки, просто проверяет ее.   -  person chux - Reinstate Monica    schedule 27.05.2021