是否有符合 C++ 标准的方法来在编译时(或运行时,作为替代方案)确定“float”、“double”和“long double”的结构?
如果我假设std::numeric_limits< T >::is_iec559 == true
和std::numeric_limits< T >::radix == 2
,我怀疑这可能通过以下规则:
- 第一个 X 位是有效数字。
- 接下来的 Y 位是指数。
- 最后一位是符号位。
用下面的表达式模糊地像:
size_t num_significand_bits = std::numeric_limits< T >::digits;
size_t num_exponent_bits = log2( 2 * std::numeric_limits< T >::max_exponent );
size_t num_sign_bits = 1u;
除了我知道
std::numeric_limits< T >::digits
包括“整数位”,无论格式是否实际明确表示它,所以我不知道如何以编程方式检测和调整这一点。- 我猜
std::numeric_limits< T >::max_exponent
总是2^(num_exponent_bits)/2
。
背景:我正在尝试以便携方式克服两个问题:
- 设置/获取有效数字中的位。
- 确定“long double”的结尾在哪里,这样我就知道不要读取具有未初始化内存的隐式填充位。