确保C ++双打都是64位
-
09-09-2019 - |
题
在我的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。