Wha*_*sit 19 c++ compiler-construction precision types ieee-754
在我的C++程序中,我需要从外部字节序列中提取64位浮点数.有没有办法确保在编译时双打是64位?我应该使用其他类型来存储数据吗?
编辑:如果您正在阅读本文并实际寻找确保以IEEE 754格式存储的方法,请查看下面的Adam Rosenfield的答案.
Ada*_*eld 28
在C99中,您可以检查是否__STDC_IEC_559__定义了预处理程序符号.如果是,则保证a double将是用IEEE 754(也称为IEC 60559)格式表示的8字节值.请参阅C99标准,附录F.我不确定这个符号是否在C++中可用.
#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif
Run Code Online (Sandbox Code Playgroud)
或者,您可以检查预定义常量__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++.
Eva*_*ran 12
对其他答案的改进(假设char为8位,标准不保证这一点......).会是这样的:
char a[sizeof(double) * CHAR_BIT == 64];
Run Code Online (Sandbox Code Playgroud)
要么
BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);
Run Code Online (Sandbox Code Playgroud)
您可以在<limits.h>或中找到CHAR_BIT <climits>.
检查std::numeric_limits< double >::is_iec559您是否需要知道您的C++实现是否支持标准双精度.这不仅保证了总位数为64,而且保证了double内所有字段的大小和位置.
没有提升的解决方案是像这样定义数组
char a[ 8 == sizeof(double) ];
Run Code Online (Sandbox Code Playgroud)
如果 double 不是 64 位,则代码将如下所示
char a[0];
Run Code Online (Sandbox Code Playgroud)
这是一个编译时错误。只需在此说明附近添加适当的注释即可。