На компьютерах числа с плавающей запятой никогда не бывают точными. Они всегда просто близкое приближение. (1е-16 близко.)
Иногда есть скрытые биты, которые вы не видите. Иногда основные правила алгебры больше не применяются: a * b! = B * a. Иногда сравнение регистра с памятью показывает эти тонкие различия. Или используя математический сопроцессор против библиотеки с плавающей запятой во время выполнения. (Я делал это очень долго.)
C99 определяет: (Смотрите math.h )
double round(double x);
float roundf(float x);
long double roundl(long double x);
.
Или вы можете бросить свой собственный:
template<class TYPE> inline int ROUND(const TYPE & x)
{ return int( (x > 0) ? (x + 0.5) : (x - 0.5) ); }
Для эквивалентности с плавающей запятой, попробуйте:
template<class TYPE> inline TYPE ABS(const TYPE & t)
{ return t>=0 ? t : - t; }
template<class TYPE> inline bool FLOAT_EQUIVALENT(
const TYPE & x, const TYPE & y, const TYPE & epsilon )
{ return ABS(x-y) < epsilon; }