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

Ily*_*kiy 20 c++ floating-point qt types

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

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

#include <stdint.h>

uint32_t var;  //32 bit unsigned integer
uint64_t var1; //64 bit unsigned integer
Run Code Online (Sandbox Code Playgroud)

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

float var; //Usually is 32 bit, but NOT GUARANTEED to be 32 bit
Run Code Online (Sandbox Code Playgroud)

是具体的实现,并不一定是32位..(纠正我,如果我错了).

我正在使用qt,所以如果有任何解决方案使用它我会接受它 - 我找不到任何像quint16 for floats(qreal根据平台改变大小).

Kei*_*son 12

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

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

如果有人决定将Qt移植到例如64位的Cray矢量机float,那么你不会有32位浮点类型(除非你自己在软件中实现它,但我看不到这将是多么有用).

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

你最好的选择可能是添加这样的东西main,或者在程序启动期间保证调用的某些函数:

assert(CHAR_BIT * sizeof (float) == 32);
Run Code Online (Sandbox Code Playgroud)

CHAR_BIT == 8如果您的代码隐含地依赖于此,那么也许也是如此.

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

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

  • 您也可以进行编译时间检查 - C++定义宏`FLT_MIN`,`FLT_MAX`,`FLT_MANT_DIG`(`#include <cfloat>`); 或者在C++ 11代码中,您可以使用`static_assert(numeric_limits <float> :: max()<= ...)`(或min等)(`#include <limits>`). (3认同)

Mar*_*k B 7

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

#include <climits>

char static_assert_float32[1 - (2 * ((sizeof(float) * CHAR_BIT) != 32))];
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,有一个明显的`static_assert(sizeof(float)*CHAR_BIT == 32,'需要32位浮点数"`这使得32显而易见且代码可移植. (3认同)
  • @AdamBurry:是的,C++ 将 `byte` 定义为 `char` 的大小,它不一定是八位字节(8 位)。因此,根据定义,“sizeof(char)==1”无处不在。所有其他尺寸都是相对于此定义的。 (2认同)