Fixed-point to string
От: cppguard  
Дата: 30.08.23 22:51
Оценка:
Накидал тут на коленке код для вывода вещественных чисел с фиксированной запятой в привычном виде. Вышло как-то слишком просто. Имеет право на жизнь?
#include <iostream>

template<typename T, unsigned N>
class Q {
    T value;
public:
    Q(T value): value(value) {}
    T integral() const { return value >> N; }
    T fractional() const { return value & (1 << N - 1); }
};

template<unsigned Position, unsigned Multiplier = 5>
struct FractToString {
    static unsigned value(unsigned value, unsigned acc = 0) {
        auto d = (value >> (Position - 1) & 1) * Multiplier;
        return FractToString<Position - 1, Multiplier * 5>::value(value, acc * 10 + d);
    }
};

template<unsigned Multiplier>
struct FractToString<0, Multiplier> {
    static unsigned value(unsigned value, unsigned acc) {
        return acc;
    }
};


template<typename T, unsigned N>
std::ostream& operator<< (std::ostream&  os, const Q<T, N>& q)
{
    return os << static_cast<int>(q.integral()) << "." << static_cast<int>(FractToString<N>::value(q.fractional()));
}


int main(int argc, char *argv[]) {
    std::cout << Q<uint8_t, 3>(0b101101) << std::endl;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.