Я пытаюсь использовать библиотеку Boost.Units для преобразования частоты (например, 20 кГц) в длительность ее периода (50000 наносекунд). Я не хочу использовать с плавающей точкой.
Проблема, с которой я столкнулся, состоит в том, что простое взятие обратной 1 / f приводит к усечению нуля, поэтому даже после преобразования в наносекунды результат получается равным 0 нс. Если я вместо этого сначала преобразую в мегагерцы, а затем возьму обратное, снова первый шаг вызывает усечение нуля.
Один из обходных путей, который я нашел, состоит в том, чтобы использовать boost :: рациональное использование в качестве 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;
1.0f/f
чтобы избежать усечения
Других решений пока нет …