在我的C ++程序,我需要从外部字节序列拉一个64位浮点数。是否有某种方式来确保,在编译时,那双打64位?有一些其他类型的,我应该用它来存储数据呢?

编辑:如果你正在读这篇文章,确实的寻找一种方式,以确保存储在IEEE 754格式,看看下面亚当罗森菲尔德的答案

有帮助吗?

解决方案

在其他的答案的改进(即假定一个字符是8位时,该标准没有保证这一点。)。将是这样的:

char a[sizeof(double) * CHAR_BIT == 64];

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);

可以找到在<limits.h><climits>定义CHAR_BIT。

其他提示

在C99,可以只检查是否预处理器符号__STDC_IEC_559__定义。如果是,则可以保证一个double将与IEEE 754所表示的8字节的值(也称为IEC 60559)格式。见C99标准,附录F,我不知道这符号是用C ++中,虽然。

#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif

可替换地,可以检查预定义的常量__DBL_DIG__(应为15),__DBL_MANT_DIG__(应为53),__DBL_MAX_10_EXP__(应该是308),__DBL_MAX_EXP__(应为1024),__DBL_MIN_10_EXP(应为-307),和__DBL_MIN_EXP__(应该-1021)。这些应该是可用在C和C ++的各种口味。

检查std::numeric_limits< double >::is_iec559如果你需要知道你的C ++实现是否支持标准双打。这保证不仅比特的总数量是64,而且大小和双内的所有字段的位置。

我不认为你应该专注于你的双“原始尺寸”(通常是80位,而不是64位),而它的精度。

由于numeric_limits ::此digits10是相当容易的。

可以使用升压以静态断言做这个。看看在命名空间内的使用示例

不升压的解决方案是定义像这样的阵列

char a[ 8 == sizeof(double) ];

如果双不是64位,然后该代码将看起来像

char a[0];

这是一个编译时间错误。只要把适当的注释该指令的附近。

请参阅此篇获得了类似的问题和非升压编译时间断言称为CCASSERT。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top