15 сентября 2007

Fixed point arithmetics

Почему-то в Boost-е до сих пор нет арифметики с фиксированной точкой. Была предложена подобная библиотека, но ее завернули, попросив автора немного доработать библиотеку. А автор на это забил. Поэтому приходится изобретать очередные велосипеды. Что-то типа такого:
template <unsigned Precision = 8, typename Integer = int>
class Fixed
{
public:
Fixed() {}
Fixed(Integer Value) : _Value(Value << Precision) {}
Fixed& operator +=(Fixed rhs) { _Value += rhs._Value; return *this; }
Fixed& operator +=(Integer rhs) { _Value += (rhs << Precision); return *this; }
Fixed operator /(Integer rhs) { return Fixed(_Value / rhs, RawValue); }
Integer Int() { return _Value >> Precision; }
Integer Round() { return (_Value + (1 << (Precision - 1))) >> Precision; }

private:
enum ERawValueFlag { RawValue };
Fixed(Integer Value, ERawValueFlag) : _Value(Value) {}

private:
typename Integer _Value;
};

Комментариев нет: