引用浮点类型时max_digits10为0有什么好处?

时间:2019-03-07 01:29:23

标签: c++ c++11 floating-point precision numeric-limits

在C ++ 11中,std::numeric_limits<Type>::max_digits10为引用浮点数的Type返回0的好处是什么?

例如:

constexpr int precisionPositive(const float &floatVal)
{
  using numericType    = std::remove_reference<decltype(floatVal)>::type;
  constexpr int digits = std::numeric_limits<numericType>::max_digits10;

  return digits;
}

constexpr int precisionZero(const float &floatVal)
{
  using numericType    = decltype(floatVal);
  constexpr int digits = std::numeric_limits<numericType>::max_digits10;

  return digits;
}

precisionPositive返回9,precisionZero返回0。

在什么情况下,零值会比给出编译时错误有帮助?

2 个答案:

答案 0 :(得分:2)

根据C ++标准(n4659),在numeric_limits类模板中,max_digits10的默认值为0

  

21.3.4类模板numeric_limits [numeric.limits]

namespace std {
template<class T> class numeric_limits {
public:
...  
static constexpr int max_digits10 = 0;

仅当模板专门用于floatdouble等时,max_digits10才被赋予特定的值。

考虑 float 的专业化。

  

21.3.4.2 numeric_limits专长[numeric.special]

namespace std {
template<> class numeric_limits<float> {
public:
...
static constexpr int max_digits10 = 9;

实现也遵循此原则。例如,请参见GCC的标准C​​ ++库标头limits

因此,除了专门为max_digits10赋予特定值的特殊化之外,默认值为0,并且因此,用于引用浮点类型的max_digits10的值也为0

答案 1 :(得分:0)

我对“为什么”问题没有正确的答案。购买我可能会使用以下代码:

C ++ 11:

template<typename T>
    using bare_value_t=typename
        std::decay<T>::type;

C ++ 14:

template<typename T>
    using bare_value_t=
        std::decay_t<T>;

C ++ 20:

template<typename T>
    using bare_value_t=
        std::remove_cvref_t<T>;

并且:

template<typename T>
    using limits=
        std::numeric_limits<bare_value_t<T> >;

cout<<limits<float&>::max_digits10;