尚未操作的 32 位规范化浮点数在任何平台/编译器上是否相同?

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

本文关键字:编译器 平台 是否 任何 操作 浮点数 规范化      更新时间:2023-10-16

例如:

float a = 3.14159f;

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

不一定: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。