У вас две проблемы. Во-первых, ваша toBinary
функция не выполняет то, что вы хотели - она должна выглядеть примерно так (при условии, что процессор имеет непосредственный порядок байтов):
template<class T> bitset<sizeof(T)*CHAR_BIT> toBinary(const T num)
{
bitset<sizeof(T)*CHAR_BIT> mybits;
const char * const p = reinterpret_cast<const char*>(&num);
for (int i = sizeof(T)-1; i >= 0; i--)
for (int j = CHAR_BIT-1; j >= 0; j--)
mybits.set(i*CHAR_BIT + j, p[i] & (1 << j));
return mybits;
}
Другая проблема, как описывает Маттео: numeric_limits<double>::epsilon
- это разница между 1.0
и следующим большим представимым значением, а не разница между любым числом с плавающей запятой и следующим большим представимым значением. Вы можете убедиться в этом сами, изменив свою программу, пытаясь увеличить 0.5
, 1.0
и 2.0
- добавление epsilon
увеличит второй до последнего бита 0.5
последний бит 1.0
и не влияет на 2.0
.
Существует способ сделать то, что вы пытаетесь сделать: семейство функций nextafter
(они являются частью C99).