Если вы изменили свой пример на использование double
, тогда ошибка исчезнет. Проблема в том, что float
более ограничен, чем double
в количестве значимых цифр, которые он может хранить. Добавление 0.5 к вашему значению просто превышает предел точности для поплавка, заставляя его преформировать некоторое округление. В этом случае 8388609.0f + 0.5f == 8388610.0f
.
#include<iostream>
long myround(double f)
{
if (f >= UINT_MAX) return f;
return f + 0.5;
}
int main()
{
double f = 8388609.0;
std::cout.precision(16);
std::cout << myround(f) << std::endl;
}
Если продолжать добавлять цифры на ваш номер, он также будет в конечном счете терпят неудачу по double
.
Редактировать: Вы можете легко проверить это с помощью static_assert
. Это компилируется на моей платформе static_assert(8388609.0f + 0.5f == 8388610.0f, "");
. Скорее всего, он скомпилируется на вашем.
_ «Следующее плавающее число больше 8388609,0 составляет 8388610» _ Как вы пришли к такому выводу? –
Одиночные поплавки не имеют достаточного пространства, чтобы гарантировать представление всех этих десятичных цифр (более шести). Что вы пытаетесь сделать? –
Этот код не компилируется. У вас нет объявления 'f'. Отправьте свой _actual_ [MCVE], который привел к заявленному выводу. –