Генерация следующего наибольшего или наименьшего представимого числа с плавающей запятой без переворота битов - PullRequest
18 голосов
/ 14 сентября 2011

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

Ответы [ 2 ]

21 голосов
/ 14 сентября 2011

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

3 голосов
/ 14 сентября 2011
int exponent;
significand= frexp(number, &exponent);
significand+= epsilon;
next= ldexp(significand, exponent);

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

...