Сгенерируйте следующий наибольший или наименьший представляемый номер с плавающей запятой без бита

Для произвольного конечного числа с плавающей запятой существует ли способ определить, что представляет собой следующее представимое число с плавающей запятой? Например, учитывая 1.0f, по определению следующее наибольшее представимое число равно 1.0f + std:: numeric_limits <float> :: epsilon(). Есть ли способ синтезировать epsilon для любого значения - не только 1.0f - не прибегая к бит-скручиванию и/или явным знанием того, как машина представляет значения с плавающей запятой?

Ответ 1

В С++ 11 вы используете std::nextafter(). Если в системе C99 вы используете nextafterf, nextafter или nextafterl из математической библиотеки C (для типов float, double и long double соответственно).

Ответ 2

int exponent;
significand= frexp(number, &exponent);
significand+= epsilon;
next= ldexp(significand, exponent);

Что это такое - извлечение мантиссы, увеличение его с помощью epsilon с плавающей запятой, а затем восстановление числа с плавающей запятой. Это должно быть следующим представимым числом, которое вы получите, играя с битами мантиссы (и экспонентой по переполнению мантиссы).