FLT_HAS_SUBNORM равен 0: приводит ли выполнение fpclassify () с вручную построенным субнормальным к UB или приводит к тому, что WDB возвращает FP_SUBNORMAL?

В случае FLT_HAS_SUBNORM == 0 (или любого XXX_HAS_SUBNORM == 0 в целом) выполнение макроса fpclassify с вручную созданным субнормальным (построенным с использованием каламбура с помощью union, использованием memcpy, чтением из файла и т. Д.) Приводит к неопределенному поведению (UB) или приводит к хорошему- определенное поведение (WDB) возвращает FP_SUBNORMAL (как и ожидалось)?

Примечания:

  1. Стандарт C довольно сдержан в отношении FLT_HAS_SUBNORM is 0 случая. Все, что говорится о FLT_HAS_SUBNORM is 0, это:

Характеристика как отсутствующая предназначена, если никакие операции с плавающей запятой не дают субнормальных результатов из ненормальных входных данных, даже если формат типа включает представления субнормальных чисел.

что можно интерпретировать как:

Если FLT_HAS_SUBNORM равен 0, то any_normal ‹op› any_normal никогда не дает субнормальных.

  1. Стандарт C, кажется, опускает явное определение поведения для следующего случая (сформулированного как вопрос):

В случае, если FLT_HAS_SUBNORM is 0: приводит ли выполнение какой-либо операции FP с входами, представленными вручную построенными субнормальными значениями (построенными с использованием прокалывания типов через union, использования memcpy, чтения из файла и т. Д.), К неопределенному поведению (UB)?

  1. Если явное определение поведения опущено, то согласно стандарту C:

… Неопределенное поведение иначе обозначается в этом документе… отсутствием какого-либо явного определения поведения…


person pmor    schedule 03.02.2021    source источник
comment
Примечание. FLT_HAS_SUBNORM имеет 3 определенных значения: -1, 0, 1. Вопрос в том, равно ли оно нулю.   -  person chux - Reinstate Monica    schedule 03.02.2021
comment
Учитывая FLT_HAS_SUBNORM == 0, относится ли вопрос к подмножеству реализаций, которые действительно включают представления субнормальных чисел, а созданное вручную является допустимым?   -  person chux - Reinstate Monica    schedule 03.02.2021
comment
Вы можете отправить отчет о дефекте в комитет по стандартизации ISO C, указав на отсутствие ясности и предложив исправление, или обратитесь к Фреду Тайдману из Tydeman Consulting, у которого, похоже, есть предложил эти макросы. Лучше всего думать о субнормальной поддержке как о наборе двух свойств: считаются ли субнормальные входные данные нулевыми (DAZ = денормальные значения равны нулю); Могут ли арифметические операции давать субнормальные результаты или они сбрасываются до нуля (FTZ = flush to zero). Во многих средах программирования DAZ = true подразумевает FTZ = true и наоборот.   -  person njuffa    schedule 04.02.2021
comment
Я не считаю это UB по пропуску; все фобы были зловонными, а джо не производил фоббл, это означает, что фробы, произведенные из других источников, все еще зловещие. Я согласен с заполнением отчета о дефектах, поскольку цель неясна.   -  person M.M    schedule 05.02.2021
comment
Формулировка (1), похоже, предполагает, что они думали об этом случае и говорят, что субнормальные входные данные могут давать субнормальные выходные данные, даже когда FLT_HAS_SUBNORM == 0.   -  person M.M    schedule 05.02.2021
comment
@MM Посмотрите: stackoverflow.com/questions/65297177/.   -  person pmor    schedule 08.02.2021
comment
@ chux-ReinstateMonica Да, вопрос относится к подмножеству реализаций, которые действительно включают представления субнормальных чисел, и созданное вручную число является допустимым. Тогда должен ли макрос fpclassify, вызываемый с этим valid one в качестве ввода, вести к WDB (возвращая FP_SUBNORMAL, как ожидалось) или к UB? Другими словами: если FLT_HAS_SUBNORM == 0 и если реализации действительно включают представления субнормальных чисел, то сколько стандартных функций FP, вызываемых с вручную построенными субнормальными числами, приводят к UB? Все или некоторые? Какие именно должны привести к UB / WDB?   -  person pmor    schedule 08.02.2021
comment
@ M.M См. Также: stackoverflow.com/a/65296492/1778275. Образец цитирования: If subnormal numbers are not supported, then they are not supported regardless of how they are obtained, whether by literals in source code, arithmetic, or manipulation of the bits that represent floating-point objects..   -  person pmor    schedule 08.02.2021
comment
Хм, 0 отсутствует: характеристика как отсутствующая предназначена, если никакие операции с плавающей запятой не дают субнормальных результатов из ненормальных входных данных, даже если формат типа включает представления субнормальных чисел. Сноска № 26 подразумевает, что поведение определяется реализацией. Без какого-либо определения поведения не может быть субнормального. Я больше не делаю подробностей о стандарте C.   -  person chux - Reinstate Monica    schedule 08.02.2021
comment
@pmor это просто чье-то мнение (с которым я не согласен)   -  person M.M    schedule 10.02.2021
comment
Тот факт, что формат реализации с плавающей запятой представляет нулевые и нормализованные значения с плавающей запятой способом, совместимым с IEEE-754, не заставляет его обрабатывать другие битовые шаблоны способом, совместимым с IEEE-754. Если в реализации не указано какое-либо конкретное значение для битового шаблона с плавающей запятой, его можно будет рассматривать как представление ловушки и обрабатывать любым произвольным образом.   -  person supercat    schedule 17.02.2021
comment
@MM: Стандарт использует термин «неопределенное поведение», среди прочего, для описания действий, которые должны определять поведение в некоторых реализациях, но не обязательно во всех, обычно оставляя вопрос о том, следует ли определять поведение как проблему качества реализации за пределами его юрисдикции. . Стандарт не пытается избежать характеристики действий UB, которые должны с пользой обрабатываться многими реализациями, и должны рассматриваться как правильные в коде, предназначенном только для таких реализаций.   -  person supercat    schedule 17.02.2021
comment
@njuffa Однако в C случай FLT_HAS_SUBNORM is 0 ведет к FTZ, а не к DAZ, верно?   -  person pmor    schedule 08.03.2021
comment
@ M.M (1) Примерно субнормальные входные данные могут давать субнормальные выходные данные, даже если FLT_HAS_SUBNORM == 0. Следствие правильное, однако каково практическое применение этого случая / сценария? (2) Или, может быть (гипотеза) сноска 26 (C11) косвенно пытается сказать, что если FLT_HAS_SUBNORM == 0, то передача субнормальных входных данных операциям с плавающей запятой недопустима? Если да, значит ли это, что если FLT_HAS_SUBNORM == 0, то передача субнормального ввода в fpclassify() также недопустима?   -  person pmor    schedule 08.03.2021