Нахождение ближайшего значения с плавающей точкой меньше, чем конкретное целочисленное значение в 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?