C ++声明平台无关的32位浮点数

时间:2013-09-09 19:08:00

标签: c++ qt types floating-point

有没有办法在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 for floats(qreal根据平台改变大小)。

6 个答案:

答案 0 :(得分:12)

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

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

如果有人决定将Qt移植到具有64位float的Cray向量机,那么你无论如何都不会有32位浮点类型(除非你自己实现它)软件,但我不明白这将是多么有用。)

<stdfloat.h> / <cstdfloat>对应<stdint.h> / <cstdint>。 C和C ++提供floatdoublelong double,并对它们提出最低要求,但是没有给出一种方法来请求任何特定大小的浮点类型

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

assert(CHAR_BIT * sizeof (float) == 32);
如果您的代码隐含地依赖于此,那么

也许CHAR_BIT == 8

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

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

答案 1 :(得分:7)

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

#include <climits>

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

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

答案 2 :(得分:4)

C和C ++的最常见实现将使用32位float类型。如果您确实需要捕获任何不成功的平台,您可以使用以下方法在程序的早期发出错误:

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

IEEE 758定义了众所周知的32位 binary32 ,它是常用的。但IEEE 758还定义了32位 decimal32 ,主要用于存储而不是计算。还存在其他非IEEE 758 32位浮点实现,但肯定不常见。

即使知道float是32位IEEE 758-2008 binary32 ,给定环境遵守其严格定义的程度(Nan,subnormals,rounding modes)可能会有所不同。我怀疑这是32-float实现的微妙变化的最大来源。

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

答案 5 :(得分:0)

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

请注意,仅此一项并不能告诉您float是否具体是 32位 IEEE浮点数,只是它是IEEE浮点数 - 某些实现没有例如,32位浮点硬件可能选择float为64位IEEE浮点数。