2016-03-28 3 views
3

Я любопытно, рассуждения позади, почему std::ratio только обнажает num и den значения, а не какой-то value элемента, который будет представлять рациональную величину отношения, возможно, в формеПочему у std :: ratio нет значения?

static constexpr double value = num/den;

I представьте себе, что может быть, потому что

  • Они, возможно, не хотели, чтобы зафиксировать в два раза (или какой-либо один конкретный) точность
  • Operati на тривиален для выполнения в пользовательском коде
  • Это может потребовать от грязных (небезопасно?) литого

но мне интересно, если есть другие веские причины для отсутствия члена одного значения в стандарте?

ASSIDE:

Там есть практическое применение этого для меня, потому что я ищу, чтобы реализовать более сильно типизированную версию std::ratio для strongly-typed unit library, что я работаю, для которых я думаю что-то вроде следующего будет иметь смысл (при условии, что я не хватает какой-то понимание о std::ratio и сопзЬ-Несс)

template<typename UnitType, std::intmax_t Num, std::intmax_t Denom = 1> 
struct unit_ratio : private std::ratio<Num, Denom> 
{ 
    static const UnitType value() { return UnitType((double)num/den); 
}; 

в этом случае, очевидно, выполняя num/den в пользовательском коде это не то же самое, что и возвращается a UnitType, который содержит значение num/den, но я несколько насторожен, что это плохая идея, так как std::ratio не делает что-то подобное.

+0

Не так ли, потому что число с плавающей запятой может фактически не представлять рацион? – NathanOliver

+0

@NathanOliver мне кажется, что он будет представлять его, а также 'double val = (double) myRatio :: num/myRatio :: den', что и большинство людей собирается делать с ним в своем коде. Обычно я использую 'ratio', чтобы обойти тот факт, что шаблоны не могут принимать нецелые члены не-типа. –

+5

Двойной не является действительно * рациональным * значением, его приближением * реального * значения. Рациональные числа являются целыми номерами. – Galik

ответ

5

Может быть, потому что нет ни с плавающей точкой двойной, которые могут быть точно равно отношению максимально простого 1/3 или 1/5. Только отношение, полученное линейными комбинациями 1/2 n с использованием целочисленных коэффициентов, имеет точные IEE754 представления с плавающей точкой.

Вы должны помнить, что std::ratio предназначено для рациональных номеров, то есть чисел формы num/den, где num и den являются целыми.

Так ИМХО вы можете определить float_approx, если вам нравится, но не называйте это значения, если вы действительно не хотите столкнуться уродливые случаями, когда два разных отношения будут по-прежнему разделяют то же значения.

+0

«парные комбинации» следует заменить на «суммы» (и только некоторые такие суммы). – Yakk

+0

Я думаю, что консенсус здесь в том, что я немного злоупотребляю, и вы правы, что суть проблемы в том, что мне нужно более семантически правильное имя для структуры. –

+0

@NicolasHolthaus Действительно, очень мало единиц (есть * any? * В сегодняшнем мире?), Для которых нет рационального отношения между ними. Переход на двойные единицы - плохой план, даже если вы не используете 'ratio'. – Yakk

Смежные вопросы