Я любопытно, рассуждения позади, почему 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
не делает что-то подобное.
Не так ли, потому что число с плавающей запятой может фактически не представлять рацион? – NathanOliver
@NathanOliver мне кажется, что он будет представлять его, а также 'double val = (double) myRatio :: num/myRatio :: den', что и большинство людей собирается делать с ним в своем коде. Обычно я использую 'ratio', чтобы обойти тот факт, что шаблоны не могут принимать нецелые члены не-типа. –
Двойной не является действительно * рациональным * значением, его приближением * реального * значения. Рациональные числа являются целыми номерами. – Galik