Как вы находите ближайшее неравное значение поплавка? [Дубликат]
На этот вопрос уже есть ответ здесь:
Как изменить поплавок по его наименьшему приращению (или близко к нему)? 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 ++, я предполагаю, что ответ будет применим для большинства языков программирования.