尚未操作的 32 位规范化浮点数在任何平台/编译器上是否相同?
Is a 32 bit normalized floating point number that hasn't been operated on, same on any platform/compiler?
例如:
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。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- 是否有任何 2 补充平台/编译器,其中有符号移位不做通常的事情?
- 如何创建独立于平台的宏来包装编译器扩展?
- 在每个平台上使用相同的模拟,具有正确的编译器标志
- 一个C++编译器是为不同的平台(Linux,Windows等)多次编写的,这是真的吗?
- 重用编译器前端的结果,以加快多个配置/平台的C++代码编译
- 在不同的平台/编译器上实现相同的浮点计算结果
- C/C 中POW()函数的实现是否随平台或编译器而变化
- 尚未操作的 32 位规范化浮点数在任何平台/编译器上是否相同?
- C++不使用浮点IEEE754编译器/平台
- 在64位平台上使用交叉编译器生成错误32位.exe
- 交叉编译器/平台裸包装函数,无条件跳转到函数指针
- 如何让所有平台编译器为 NaN 输出相同的字符串
- Arduino平台编译器标志
- 如何生成 64 位.dll哪个 gcc 编译器或其他。无法在 AMD 64 位平台上加载 IA 32 位.dll
- 使用Intel编译器集作为平台工具集
- 在哪里可以找到关于跨不同平台/编译器的c++内存对齐的文档?