确保C ++双精度数为64位

时间:2009-04-15 15:44:53

标签: c++ types precision compiler-construction ieee-754

在我的C ++程序中,我需要从外部字节序列中提取64位浮点数。有没有办法确保在编译时双打是64位?我应该使用其他类型来存储数据吗?

编辑:如果您正在阅读此内容而实际正在寻找确保以IEEE 754格式存储的方法,请查看下面的Adam Rosenfield的答案。

7 个答案:

答案 0 :(得分:27)

在C99中,您可以检查是否定义了预处理程序符号__STDC_IEC_559__。如果是,则保证double将是用IEEE 754(也称为IEC 60559)格式表示的8字节值。参见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 ++版本。

答案 1 :(得分:11)

对其他答案的改进(假设char为8位,标准不保证这一点......)。会是这样的:

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

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

您可以在<limits.h><climits>中找到CHAR_BIT。

答案 2 :(得分:7)

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

答案 3 :(得分:6)

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

感谢numeric_limits :: digits10,这非常简单。

答案 4 :(得分:5)

您可以使用Boost static assertions执行此操作。请查看Use at namespace scope示例。

答案 5 :(得分:4)

没有增强的解决方案就是像这样定义数组

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

如果double不是64位,则代码看起来像

char a[0];

这是一个编译时错误。只需在此说明附近附上适当的评论。

答案 6 :(得分:1)

请参阅this post以了解类似问题和非强制编译时断言,称为CCASSERT。

相关问题