Нахождение ближайшего значения с плавающей точкой меньше, чем конкретное целочисленное значение в C ++?

У меня есть входное значение с плавающей запятой, которое составляет 0,0f <= значение <1,0f (обратите внимание, меньше, чем один).

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

Например, если я начну со значения, такого как:

0.99999983534521f

Затем умножив его на 100, я получу:

100.000000000000f

Что хорошо, но как мне тогда уменьшить представление с плавающей запятой до ближайшего значения с плавающей запятой, которое по-прежнему меньше 100?

Я нашел этот маленький ручной трюк:

union test
{
    int integer;
    float floating;
};

test value;

value.floating = 1.0f;

printf("%x\n", value.integer);

Затем я беру это шестнадцатеричное значение и уменьшаю его на одну шестнадцатеричную цифру, а затем устанавливаю его явно так:

unsigned int almost_one = 0x3f7fffff;

float value = 1.0f;

if (value >= 1.0f)      std::memcpy(&value, &almost_one, sizeof(float));

Это хорошо работает для этого конкретного значения, но есть ли более общий подход, который я могу использовать вместо этого?

Я надеюсь, что есть волшебная инструкция, которую я не знаю, которую я могу использовать для достижения этой цели!

Редактировать: большой набор ответов здесь, std :: nextafter выглядит так, как я ищу. К сожалению, я пока не могу использовать математические библиотеки C ++ 11, поэтому у меня это не сработает. Чтобы сохранить сложные вещи, я помечу этот вопрос на C ++ 11 и приму ответ Майка ниже.

Я начал новый вопрос для C ++ 03:Альтернатива C ++ 11 std :: nextafter и std :: nexttoward для C ++ 03?

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

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