首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++声明与平台无关的32位浮点数

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

Stack Overflow用户
提问于 2013-09-10 03:08:00
回答 4查看 30.6K关注 0票数 26

有没有一种方法可以在C++中声明32位浮点值-确保它始终是32位,而不管平台/编译器?

对于像这样的整数,我可以这样做:

代码语言:javascript
复制
#include <stdint.h>

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

有没有办法对floats做这样的事情?就我所知道,

代码语言:javascript
复制
float var; //Usually is 32 bit, but NOT GUARANTEED to be 32 bit

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-10 03:35:44

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

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

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

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

最好的办法可能是在main中添加类似这样的内容,或者在程序启动时保证会调用的某个函数中添加如下内容:

代码语言:javascript
复制
assert(CHAR_BIT * sizeof (float) == 32);

如果您的代码隐式地依赖于此,那么也可以使用CHAR_BIT == 8

assert不太可能启动--如果启动了,您就会遇到更大的问题。

您可能需要重新考虑是否真的需要32位浮点类型。如果您的代码运行在具有64位float的系统上,如何才能满足您的需求呢?

票数 14
EN

Stack Overflow用户

发布于 2013-09-10 03:53:00

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

代码语言:javascript
复制
#include <climits>

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

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

票数 10
EN

Stack Overflow用户

发布于 2013-09-10 03:21:04

最常见的C和C++实现将使用32位float类型。如果您真的需要捕获任何平台,但情况并非如此,您可以使用以下代码在程序早期抛出错误:

代码语言:javascript
复制
#include <limits.h>
if (sizeof(float) * CHAR_BIT != 32)
    // error code here

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18705192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档