Частота Boost.Units к периоду

Я пытаюсь использовать библиотеку Boost.Units для преобразования частоты (например, 20 кГц) в продолжительность ее периода (50000 наносекунд). Я не хочу использовать плавающую точку.

Проблема, с которой я столкнулся, заключается в том, что простое взятие обратной 1/f вызывает усечение нуля, поэтому даже после преобразования в наносекунды результат получается 0 нс. Если вместо этого я сначала конвертирую в мегагерцы, а затем беру обратное значение, снова первый шаг вызывает усечение нуля.

Один обходной путь, который я нашел, заключается в использовании boost::rational в качестве value_type количества. Это работает, но это кажется мне уродливым. Есть ли лучшее решение? Я новичок в библиотеке Units, и пока она немного ошеломляет.

Мое решение на данный момент:

typedef make_scaled_unit<si::time, scale<10, static_rational<-9> > >::type nanosecond;
typedef quantity<si::frequency,rational<unsigned>> freq_quantity;
typedef quantity<nanosecond,rational<unsigned>> time_quantity;
rational<unsigned> val(20);
freq_quantity Fs(val*si::kilo*si::hertz);

cout << Fs << endl;

cout << static_cast<time_quantity>(rational<unsigned>(1)/Fs) << endl;

person user1714423    schedule 17.10.2013    source источник
comment
Одно улучшение, которое я нашел до сих пор, состоит в том, чтобы заменить многословную и запутанную строку make_scaled_unit выше ее гораздо более простым эквивалентом: typedef decltype(si::nano*si::seconds) nanosecond;   -  person user1714423    schedule 18.10.2013


Ответы (1)


1.0f/f чтобы избежать усечения

person IdeaHat    schedule 17.10.2013