繁体   English   中英

浮点类型表示

[英]Floating point types representation

std::numeric_limits<float>::is_iec559 + std::numeric_limits<float>::digits == 24足以确保(1) float是 IEEE 754 中的 binary32(2) ? 与 ... 数字 == 53 相同的 double ?

  1. 在任何情况下,包括仍然尊重 C++ 标准的最奇怪的实现。
  2. “binary32”是 IEEE 754 标准中浮点的特定表示,我的意思不是“以 32 位存储”。

编辑:+ std::numeric_limits<float>::max_exponent - 1 == 127

编辑:还有其他方法吗? 如果是,哪一个是“最好的”?

如果我正确理解你的问题,它归结为“除了binary32之外还有其他 IEC559/IEEE754 格式,它们也有 24 位尾数”? 答案是否定的。

您需要iec559部分,因为它将 C++ 标准连接到 IEC 标准。 没有它,一切都会过去。 知道它是 IEC559, digits测试很简单。

但是您想确保“24”实际上是按位计算的,因此您还需要检查radix==2 那是binary32的二进制binary32 或者,您可以检查sizeof(float)*CHAR_BIT==32 如果radix大于 2,则 32 位不能容纳 24 位。

您可以使用特征类来检查您的表示是否符合某些期望。

以下是用于测试您的表示的特征:

namespace num {
    template <std::size_t N> struct ieee754_traits;
    
    template <> struct ieee754_traits<4> {
      using unsigned_type = uint32_t;
      static constexpr std::size_t sign_size = 1;
      static constexpr std::size_t exp_size = 8;
      static constexpr std::size_t mant_size = 23;
      static constexpr std::size_t exp_shift = 127;
      static constexpr int32_t exp_mask = 0xFF;
      static constexpr unsigned_type mant_mask = 0x7FFFFF;
    };
    
    template <> struct ieee754_traits<8> {
      using unsigned_type = uint64_t;
      static constexpr std::size_t sign_size = 1;
      static constexpr std::size_t exp_size = 11;
      static constexpr std::size_t mant_size = 52;
      static constexpr std::size_t exp_shift = 1023;
      static constexpr int32_t exp_mask = 0x7FF;
      static constexpr unsigned_type mant_mask = 0xFFFFFFFFFFFFF;
    };

    template<typename T>
    constexpr bool check_ieee754() {
        // add more check here
        return std::numeric_limits<T>::digits == (num::ieee754_traits<sizeof(T)>::mant_size + 1) &&
           std::numeric_limits<T>::max_exponent == (num::ieee754_traits<sizeof(T)>::exp_mask - num::ieee754_traits<sizeof(T)>::exp_shift);
    }
}

然后,您可以检查您的表示:

static_assert(sizeof(float) == 4 && sizeof(double) == 8);
static_assert(num::check_ieee754<float>(), "does not match ieee754");
static_assert(num::check_ieee754<double>(), "does not match ieee754");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM