确保C++双精度数为64位

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>.

  • 嗯,不,它根本没有.sizeof以字符为单位返回.CHAR_BIT定义为每个字符的位数.通过CHAR_BIT乘以sizeof(x),你就可以*精确*x的位数. (6认同)
  • 最后,从你引用的SAME段落中引用:"sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1;" 如果sizeof(char)== 1并且sizeof by definition以字节为单位返回.那意味着char*与字节大小相同.但是,一个字节不必是8位. (3认同)
  • 此外,由于CHAR_BIT是从c开始的,因此c的规则适用:引用C99草案标准(第6.2.6.1p3节):"存储在任何其他对象类型的对象中的值由nx个CHAR_BIT位组成,其中n是大小这种类型的对象,以字节为单位." (2认同)

MSa*_*ers 7

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


Edo*_* A. 6

我不认为你应该关注你的双倍的"原始大小"(通常是80位,而不是64位),而是它的精确度.

感谢numeric_limits :: digits10,这非常简单.


Myk*_*yev 5

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

char a[ 8 == sizeof(double) ];
Run Code Online (Sandbox Code Playgroud)

如果 double 不是 64 位,则代码将如下所示

char a[0];
Run Code Online (Sandbox Code Playgroud)

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


Mih*_*șan 5

您可以使用Boost静态断言来执行此操作.查看使用命名空间作用域示例.