Говоря прямо, мой вопрос точно такой, как указано в заголовке: в приложении, написанном с использованием C ++, есть ли способ определить, нормализуются ли поплавки / двойные денормалы компилятором / системой (например, через DAZ, FTZ, так далее)?
Если нужен контекст, то я пытаюсь программно определить минимальные значения типа float / double. Эти результаты, однако, зависят от того, являются ли денормали «нормализованы» или нет: если они есть, минимальные значения задаются числовыми пределами std min (), в противном случае — denorm_min ().
Вы должны просто доверять реализации, чтобы вернуться правильные значения для std::numeric_limits
. Если std::numeric_limits<float>::has_denorm
является std::denorm_present
, тогда вы должны предположить, что обычные операторы C ++ не будут неявно нормализовать значения с плавающей точкой.
Обратите внимание, что это отдельный запрос от std::numeric_limits<float>::has_iec559
, какие испытания для использования поплавков IEC-559 / IEEE-754. Таким образом, система может использовать поплавки IEEE-754, но не поддерживать денормализованные поплавки. Следовательно, реализации, которые всегда сбрасывают денормализованные числа с плавающей точкой в ноль, должны возвращать std::denorm_absent
за has_denorm
,
Других решений пока нет …