C++ 可移植浮点位表示?

标签 c++ floating-point portability ieee-754 bit-representation

是否有符合 C++ 标准的方法来在编译时(或运行时,作为替代)确定“float”、“double”和“long double”的结构?

如果我假设 std::numeric_limits< T >::is_iec559 == truestd::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”的结尾位置,这样我就知道不要读取具有未初始化内存的隐式填充位。

最佳答案

简而言之,没有。如果std::numeric_limits<T>::is_iec559 , 然后你 知道 T 的格式, 或多或少:你仍然需要 确定字节顺序。对于其他任何事情,所有的赌注都没有了。 (我知道仍在使用的其他格式甚至都没有 base 2:例如,IBM 大型机使用 base 16。) IEC float 的“标准”排列有符号 高阶位,然后是指数和尾数 低阶位;如果你能成功地将它视为 uint64_t ,例如(通过 memcpyreinterpret_castunion —`memcpy 保证可以工作,但更少 比其他两个更有效),那么:

double :

uint64_t tmp;
memcpy( &tmp, &theDouble, sizeof( double ) );
bool isNeg = (tmp & 0x8000000000000000) != 0;
int  exp   = (int)( (tmp & 0x7FF0000000000000) >> 52 ) - 1022 - 53;
long mant  = (tmp & 0x000FFFFFFFFFFFFF) | 0x0010000000000000;

对于` float :

uint32_t tmp;
memcpy( &tmp, &theFloat, sizeof( float ) );
bool isNeg = (tmp & 0x80000000) != 0;
int  exp   = (int)( (tmp & 0x7F800000) >> 23 ) - 126 - 24 );
long mant  = (tmp & 0x007FFFFF) | 0x00800000;

关于 long double ,更糟,因为不同 编译器以不同的方式对待它,即使在同一台机器上也是如此。 名义上,它是十个字节,但出于对齐的原因,它可能在 事实上是 12 或 16。或者只是 double 的同义词. 如果是 超过 10 个字节,我认为你可以指望它被打包 进入前 10 个字节,因此 &myLongDouble给出了 10 字节值的地址。但一般来说,我会避免 long double .

关于C++ 可移植浮点位表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301076/

相关文章:

c++ - 在几层抽象之后尝试交换指针 vector 中的指针

java - java中截断结果集值的函数

windows - 使用免费工具开发基于 Windows 的轻量级(无运行时)GUI 应用程序

linux - C++ 从 Windows 到 Linux 的可移植性

c++ - Outlook Express类似地址栏控件的实现方法

c++ - 在框架中使用 OpenGL 上下文编写简单的 wxWidgets 应用程序

python - 下面的二次方程代码有什么问题?

c++ - 可移植的 C++ 多线程

c++ - CUSP 稀疏库给出奇怪的结果

java - 如何将浮点值舍入为 double 值?