Ответ 1
В С++ 11 вы используете std::nextafter()
. Если в системе C99 вы используете nextafterf
, nextafter
или nextafterl
из математической библиотеки C (для типов float
, double
и long double
соответственно).
Для произвольного конечного числа с плавающей запятой существует ли способ определить, что представляет собой следующее представимое число с плавающей запятой? Например, учитывая 1.0f, по определению следующее наибольшее представимое число равно 1.0f + std:: numeric_limits <float> :: epsilon(). Есть ли способ синтезировать epsilon для любого значения - не только 1.0f - не прибегая к бит-скручиванию и/или явным знанием того, как машина представляет значения с плавающей запятой?
В С++ 11 вы используете std::nextafter()
. Если в системе C99 вы используете nextafterf
, nextafter
или nextafterl
из математической библиотеки C (для типов float
, double
и long double
соответственно).
int exponent;
significand= frexp(number, &exponent);
significand+= epsilon;
next= ldexp(significand, exponent);
Что это такое - извлечение мантиссы, увеличение его с помощью epsilon с плавающей запятой, а затем восстановление числа с плавающей запятой. Это должно быть следующим представимым числом, которое вы получите, играя с битами мантиссы (и экспонентой по переполнению мантиссы).