在我的 C++ 程序中,我需要从外部字节序列中提取一个 64 位浮点数。有什么方法可以确保在编译时双精度为 64 位?我应该使用其他类型来存储数据吗?
编辑:如果您正在阅读本文并实际上正在寻找一种方法来确保以 IEEE 754 格式存储,请查看下面的 Adam Rosenfield 的答案。
在我的 C++ 程序中,我需要从外部字节序列中提取一个 64 位浮点数。有什么方法可以确保在编译时双精度为 64 位?我应该使用其他类型来存储数据吗?
编辑:如果您正在阅读本文并实际上正在寻找一种方法来确保以 IEEE 754 格式存储,请查看下面的 Adam Rosenfield 的答案。
在 C99 中,您可以检查是否__STDC_IEC_559__
定义了预处理器符号。如果是,那么您可以保证 adouble
是一个 8 字节的值,用 IEEE 754(也称为 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++。
对其他答案的改进(假设 char 是 8 位,标准不保证这一点..)。会是这样的:
char a[sizeof(double) * CHAR_BIT == 64];
或者
BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);
<limits.h>
您可以在或中找到定义的 CHAR_BIT <climits>
。
检查std::numeric_limits< double >::is_iec559
您是否需要知道您的 C++ 实现是否支持标准双精度。这不仅保证了总位数为 64,还保证了 double 内所有字段的大小和位置。
我认为您不应关注双精度的“原始大小”(通常是 80 位,而不是 64 位),而应关注其精度。
感谢 numeric_limits::digits10 这相当容易。
没有boost的解决方案是像这样定义数组
char a[ 8 == sizeof(double) ];
如果双精度不是 64 位,那么代码将如下所示
char a[0];
这是一个编译时错误。只需在此说明附近添加适当的注释即可。
您可以使用Boost 静态断言来执行此操作。查看在命名空间范围内使用示例。
有关类似问题和称为 CCASSERT 的非增强编译时断言,请参阅此帖子。