浮点类型表示

问题描述

std::numeric_limits<float>::is_iec559 + std::numeric_limits<float>::digits == 24是否足以确保(1)float是IEEE 754中的binary32(2)?对于具有...位数== 53的双精度字相同?

  1. 无论如何,包括仍然遵循C ++标准的最奇怪的实现。
  2. “ binary32”是IEEE 754标准中浮点的一种特定表示形式,我的意思不是“以32位存储”。

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

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

解决方法

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

您需要iec559部分,因为这是将C ++标准连接到IEC标准的部分。没有它,任何事情都会发生。 digits测试知道它是IEC559,很简单。

但是您要确保“ 24”实际上是按位计算的,因此也要检查radix==2。这就是binary32中的二进制文件。或者,您可以检查是否sizeof(float)*CHAR_BIT==32。如果radix大于2,则不能将32位的24位数字容纳进去。

,

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

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

function getData() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Lager123");
    
  var importXpath_1 = '=IMPORTHTML("URLwithSIMPLEtable","table",1)';
  
  sheet.getRange("A1").setValue(importXpath_1);
  
}

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

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);
    }
}