Написано как макросы:

ема: при заданном константном выражении с плавающей запятой, можем ли мы написать макрос, который оценивает константное выражение, значение которого является степенью двойки, равной наиболее значимому значению значенияи? Эквивалентно, это просто наибольшая сила двух меньше или равна входной по величине.

Для целей этого вопроса мы можем игнорировать:

Значения почти переполнения или почти переполнения (они могут обрабатываться конечным числом приложений?: масштабировать).Отрицательные входные данные (они могут быть обработаны аналогичным образом).Реализации, не соответствующие Приложению-F (на самом деле ничего полезного не может быть сделано в них с плавающей запятой).Странность вокруг избыточной точности (float_t а такжеdouble_t можно использовать сFLT_EVAL_METHOD и другиеfloat.h макросы, чтобы справиться с этим безопасно).

Таким образом, достаточно решить задачу для положительных значений, ограниченных бесконечностью и денормальным диапазоном.

Обратите внимание, что эта проблема эквивалентна нахождению «эпсилон» для конкретного значения, то естьnextafter(x,INF)-x (или эквивалент вfloat или жеlong double), с результатом, только что масштабированнымDBL_EPSILON (или эквивалент для типа). Решения, которые сочтут вполне приемлемыми, если они проще.

У меня есть предложенное решение, которое я публикую в качестве самостоятельного ответа, но я не уверен, что оно правильное.

Ответы на вопрос(3)

Ваш ответ на вопрос