一个没有被操作过的32位归一化浮点数,在任何platform/compiler上都一样吗?

Is a 32 bit normalized floating point number that hasn't been operated on, same on any platform/compiler?

例如:

float a = 3.14159f;

如果我要检查这个数字(或任何其他规范化浮点数)中的位,这些位在其他 platform/compiler 组合中不同的可能性有多大,或者这可能吗?

不一定:C++ 标准没有定义浮点表示(它甚至没有定义有符号整数的表示),尽管大多数平台可能都以相同的 IEEE 标准(IEEE 754-2008?) .

您的问题可以改写为:无论您在哪个平台上运行,以下代码中的最终断言是否始终得到支持?

#include <cassert>
#include <cstring>
#include <cstdint>
#include <limits>
#if __cplusplus < 201103L // no static_assert prior to C++11
#define static_assert(a,b) assert(a)
#endif
int main() {
  float f = 3.14159f;
  std::uint32_t i = 0x40490fd0;// IEC 659/IEEE 754 representation
  static_assert(std::numeric_limits<float>::is_iec559, "floating point must be IEEE 754");
  static_assert(sizeof(f) == sizeof(i), "float must be 32 bits wide");
  assert(std::memcmp(&f, &i, sizeof(f)) == 0);
}

答:C++ 标准中没有任何内容可以保证断言得到支持。然而,在大多数健全的平台上,无论平台是大端还是小端,断言都会成立并且代码不会中止。只要你只关心你的代码在一些已知的平台上工作,就没问题:你可以验证测试是否通过了 :)

实际上,某些编译器可能会使用低于标准的十进制到 IEEE-754 的转换例程,该例程无法正确舍入结果,因此如果您将 f 指定为足够的精度位数,它可能与最接近十进制表示的值相差几个 LSB 的尾数。然后断言将不再成立。对于此类平台,您可能希望围绕所需的平台测试几个尾数 LSB。