HAS_SUBNORM равен 0: "субнормальные результаты" определяются до округления или после округления?
C11, 5.2.4.2.2 Характеристики плавающих типов <float.h>, 10, сноска 26:
Отсутствующая характеристика предназначена, если никакие операции с плавающей запятой не приводят к субнормальным результатам из не субнормальных входных данных, даже если формат типа включает представления субнормальных чисел.
Здесь "субнормальные результаты" определяются до округления или после округления?
Тест показывает, что некоторые реализации делают это до округления, некоторые — после округления.
Вот тест:
#if FLT_HAS_SUBNORM == 0
int subnorm_determ_method( void )
{
volatile float f1 = FLT_MIN; /* 1.17549435e-38f */
volatile float f2 = 1.0000001f;
volatile float f3;
int r;
r = fesetround(FE_UPWARD);
if ( r != 0 ) return -1; /* error: fesetround(FE_UPWARD) failed */
f3 = f1 / f2;
if ( f3 == FLT_MIN ) return 0; /* "subnormal results" are determined after rounding */
if ( f3 == 0.0f ) return 1; /* "subnormal results" are determined before rounding */
return -2; /* error: unexpected result */
}
#endif
UPD (после дальнейших исследований/экспериментов).
- Точное место выполнения логики FTZ не имеет значения для этого вопроса: независимо от того, выполняется ли логика FTZ до округления или после округления, округленный (доставленный) результат не является субнормальным.
- Если реализация не поддерживает субнормальные числа, то такая реализация не соответствует IEEE 754. Следовательно, такая реализация может свободно выбирать, на каком этапе выполняется логика FTZ. Эксперименты подтверждают, что: различные реализации, сконфигурированные с FTZ=1 (или с постоянным FTZ=1), могут выполнять логику FTZ на разных этапах и, следовательно, давать разные результаты:
или же . - Дополнительно: возбуждение исключений с плавающей запятой в случае FTZ=1: та же история, что и в 2.: Несоответствующие реализации IEEE 754 могут делать то, что хотят.
1 ответ
Никакой стандарт не определяет, будет ли реализация, которая выбирает сбрасывать субнормальные значения до нуля, делать это на основе того, является ли математический результат до округления субнормальным или результат округления субнормальным.
Какой бы выбор ни сделала реализация в этом отношении, цитируемый текст относится к полученным результатам. Если никакая операция с плавающей запятой не приводит к результату ниже нормального, то подразумевается характеристика как отсутствующая.
Обратите внимание, что выбор реализации для сброса субнормальных значений в ноль до или после округления не имеет значения: в любом случае реализация не будет давать субнормальные результаты. Тот, который сбрасывает субнормальные значения после округления, сбрасывает в ноль все результаты и только те результаты, которые были бы субнормальными. Тот, который сбрасывает перед округлением, сбрасывает в ноль все результаты, которые были бы субнормальными, и некоторые результаты, которые были бы нормальными. Оба никогда не дают ненормальных результатов.