Как вы находите ближайшее неравное значение поплавка? [Дубликат]

На этот вопрос уже есть ответ здесь:

Как изменить поплавок по его наименьшему приращению (или близко к нему)? 7 ответов

A float (a.k.a. single) значение является 4-байтовым значением и должно представлять любое действительное число. Из-за способа его форматирования и конечного числа байтов, из которого оно выделено, существует минимальное значение и максимальное значение, которое оно может представлять, и оно имеет конечную точность в зависимости от своего собственного значения.

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

float FindNearestSmaller (const float a)
{
    return a - FLT_MIN; /* This doesn't necessarily work */
}

На самом деле, вышеупомянутое почти никогда не будет работать. В приведенном выше случае, как правило, доход будет по-прежнему равенaкакFLT_MIN далеко за пределами точностиa, Вы можете легко попробовать это сами: это работает, например,0.0fили для очень небольших количеств заказаFLT_MIN, но не для чего-либо между 0 и 100.

Итак, как бы вы получили значение, которое ближе всего, но меньше или больше, чемa, учитывая точность с плавающей точкой?

Замечания: Хотя я в основном заинтересован в ответе на C / C ++, я предполагаю, что ответ будет применим для большинства языков программирования.

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

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