24

在我的 C++ 程序中,我需要从外部字节序列中提取一个 64 位浮点数。有什么方法可以确保在编译时双精度为 64 位?我应该使用其他类型来存储数据吗?

编辑:如果您正在阅读本文并实际上正在寻找一种方法来确保以 IEEE 754 格式存储,请查看下面的 Adam Rosenfield 的答案。

4

7 回答 7

34

在 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++。

于 2009-04-15T18:17:14.070 回答
13

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

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

或者

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

<limits.h>您可以在或中找到定义的 CHAR_BIT <climits>

于 2009-04-15T18:07:56.120 回答
12

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

于 2009-04-17T14:38:45.730 回答
6

我认为您不应关注双精度的“原始大小”(通常是 80 位,而不是 64 位),而应关注其精度。

感谢 numeric_limits::digits10 这相当容易。

于 2009-04-15T15:51:32.033 回答
5

没有boost的解决方案是像这样定义数组

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

如果双精度不是 64 位,那么代码将如下所示

char a[0];

这是一个编译时错误。只需在此说明附近添加适当的注释即可。

于 2009-04-15T15:48:07.657 回答
5

您可以使用Boost 静态断言来执行此操作。查看在命名空间范围内使用示例。

于 2009-04-15T15:48:34.210 回答
1

有关类似问题和称为 CCASSERT 的非增强编译时断言,请参阅此帖子。

于 2009-04-15T18:13:17.857 回答