在我的C ++程序中,我需要从外部字节序列中提取64位浮点数。有没有办法确保在编译时双打是64位?我应该使用其他类型来存储数据吗?
编辑:如果您正在阅读此内容而实际正在寻找确保以IEEE 754格式存储的方法,请查看下面的Adam Rosenfield的答案。
答案 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。