27

有没有办法在 C++ 中声明 32 位浮点值 - 确保无论平台/编译器如何,它都始终是 32 位?

我可以为这样的整数做到这一点:

#include <stdint.h>

uint32_t var;  //32 bit unsigned integer
uint64_t var1; //64 bit unsigned integer

有没有办法为花车做类似的事情?我所知道的,

float var; //Usually is 32 bit, but NOT GUARANTEED to be 32 bit

是特定于实现的,不一定是 32 位 ..(如果我错了,请纠正我)。

我正在使用 qt,所以如果有任何解决方案使用它,我会接受它 - 我找不到像 quint16 这样的浮点数(qreal 会根据平台改变大小)。

4

6 回答 6

15

您正在使用 Qt。这是特定于 C++ 的,所以我不确定为什么这个问题被标记为 C。

据我所知,在所有支持 Qt 的平台上,类型float都是 32 位 IEEE。

如果有人决定将 Qt 移植到具有 64-bit 的 Cray 向量机float,那么无论如何您都不会拥有 32-bit 浮点类型(除非您自己在软件中实现它,但我没有看到这将如何有用)。

没有<stdfloat.h>/<cstdfloat>对应于<stdint.h>/ <cstdint>。C 和 C++ 提供float, double, 和long double, 并对它们施加了最低要求,但没有为您提供要求任何特定大小的浮点类型的方法。

您最好的选择可能是在main或某些保证在程序启动期间调用的函数中添加类似这样的内容:

assert(CHAR_BIT * sizeof (float) == 32);

CHAR_BIT == 8如果你的代码隐含地依赖于它,也许也是如此。

不太可能assert会触发 - 如果确实如此,您将遇到更大的问题。

您可能需要重新考虑是否真的需要 32 位浮点类型。如果您的代码在 64 位系统上运行float,那怎么会无法满足您的要求?

于 2013-09-09T19:35:44.117 回答
10

没有这么大的浮点类型,但您始终可以静态断言大小为 32 位。甚至可能像全局 char 数组这样简单:

#include <climits>

char static_assert_float32[1 - (2 * ((sizeof(float) * CHAR_BIT) != 32))];

如果float不是 32 位,则通过声明一个负大小的数组将无法编译。

于 2013-09-09T19:53:00.210 回答
4

C 和 C++ 的最常见实现将使用 32 位float类型。如果您确实需要捕获任何不会出现这种情况的平台,您可以使用以下命令在程序早期抛出错误:

#include <limits.h>
if (sizeof(float) * CHAR_BIT != 32)
    // error code here

不幸的是,我不知道在编译时检测它的方法,我之前的回答是有缺陷的。

于 2013-09-09T19:21:04.483 回答
2

在支持 IEEE-754 的平台上,float它将是 32 位的。在没有的平台上,不同的宽度可能是您遇到的最少问题。底线 - 使用float,不用担心。

于 2013-09-09T19:15:00.220 回答
2

std::numeric_limits<float>::is_iec559当且仅当float符合 IEC 559/IEEE 754 浮点标准时,布尔静态成员常量才为真。你需要到#includeheader <limits>

请注意,仅此一项并不能告诉您是否float特别是32 位IEEE 浮点,只是它是 IEEE 浮点——例如,某些没有 32 位浮点硬件的实现可能会选择float64 位 IEEE浮点。

于 2018-05-31T20:09:14.263 回答
0

一般来说,知道 sizeof(float) 为 32 位可能就足够了,但在所有情况下都不够。

IEEE 758 定义了众所周知的 32 位二进制32 ,它通常被实现。但是 IEEE 758 还定义了一个 32 位的decimal32,主要用于存储而不是计算。还存在其他非 IEEE 758 32 位浮点实现,尽管肯定不那么常见。

即使已知float32 位 IEEE 758-2008 binary32,给定环境遵守其严格定义(Nan、次正规、舍入模式)的程度也可能会有所不同。我怀疑这是 32-float 实现细微变化的最大来源。

因此,准确了解所使用的浮点模型的目标,可能会确保跨平台的一致性,在编译时检测可能非常具有挑战性。

于 2013-09-10T02:43:13.637 回答