如何解决浮点类型表示
std::numeric_limits<float>::is_iec559
+ std::numeric_limits<float>::digits == 24
是否足以确保(1)float
是IEEE 754中的binary32(2)?对于具有...位数== 53的双精度字相同?
- 无论如何,包括仍然遵循C ++标准的最奇怪的实现。
- “ 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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。