为什么std :: ratio没有值成员?

时间:2016-03-28 18:35:25

标签: c++ c++11 stl

我很好奇为什么std::ratio只公开numden值,而不是某些value成员代表合理价值的原因。比率,可能是形式

static constexpr double value = num / den;

我想这可能是因为

  • 他们可能不想锁定双精度(或任何一个特定精度)
  • 在用户代码
  • 中执行该操作非常简单
  • 可能需要一个讨厌的(不安全的?)演员

但我很好奇是否有其他充分的理由让标准中缺少单一价值成员?

ASSIDE:

对我来说有一个实际的应用,因为我正在寻找为strongly-typed unit library实现一个更强类型的std::ratio版本,我一直在努力,为此我认为像下面这样有意义(假设我没有错过对std::ratio和const-ness的一些理解)

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与返回包含值UnitType的{​​{1}}不同,但我有点担心它是一个不好的想法,因为num / den没有做类似的事情。

1 个答案:

答案 0 :(得分:5)

也许是因为没有浮点或双精度完全等于简单的1/31/5。只有通过使用整数系数的1/2 n 的线性组合获得的比率具有精确的IEE754浮点表示。

您必须记住,std::ratio代表有理数字,即num / den形式的数字,其中num和den都是整数值。

所以恕我直言,如果你愿意,你可以定义一个 float_approx ,但不要把它称为值,除非你真的想面对两个不同比率仍然会共享相同值的丑陋案例