Являются ли двунаправленные преобразования по замыслу или ошибкой?

#include <iostream>
#include <boost/units/quantity.hpp>
#include <boost/units/systems/si/length.hpp>

using namespace boost::units;

struct bu1 : base_unit<bu1, length_dimension, 2001> {};
struct bu2 : base_unit<bu2, length_dimension, 2002> {};

BOOST_UNITS_DEFINE_CONVERSION_FACTOR(bu1, bu2, double, 1.5);

#if 1
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(bu2, bu1, double, 4.0);
#endif

int main(int argc, char *argv[])
{
quantity<bu1::unit_type> output(1 * bu2::unit_type());

//  prints 4 or 0.67
std::cout << output.value() << std::endl;

return 0;
}

Код печатает либо 4 или же 0.666667 в зависимости от того, определен ли второй коэффициент преобразования. Это должно быть задумано? В физике нет двух таких единиц, которые требуют разных коэффициентов преобразования, не так ли?

0

Решение

Это поведение «мусор в мусоре». Вы понимаете, что 1.0 / 1.5! = 4.0, не так ли? Второй коэффициент преобразования, если вы хотите быть явным, должен был быть (2.0 / 3.0), а не 4.

Первая определенная спецификация коэффициента пересчета уже работала в обоих направлениях. От документация:

Если целевым модулем является базовый блок или блок, который содержит только один базовый блок, который повышен до первой мощности (например, футы -> метры), обратное (метры -> футы в этом примере) не должно определяться явно.

Можно утверждать, что есть какая-то ошибка в том, что она даже позволяет вам указать второй коэффициент преобразования, который не согласуется с первым.

Кроме того, я надеюсь, что вы используете <повышение / ЕД / io.hpp> в вашем производственном коде, указав имя / символ для ваших единиц, а не безразмерные распечатки, такие как output.value(), Я понимаю, что короче ваш вопрос, конечно …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]