代码之家  ›  专栏  ›  技术社区  ›  Whatsit

确保C++双打是64位

  •  17
  • Whatsit  · 技术社区  · 16 年前

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

    编辑:如果您正在阅读此 事实上 寻找一种确保存储为IEEE754格式的方法,看看下面亚当·罗森菲尔德的答案。

    7 回复  |  直到 11 年前
        1
  •  11
  •   Evan Teran    16 年前

    对其他答案的改进(假定char为8位,标准不保证这一点)。如下所示:

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

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

    您可以在中找到定义的字符位 <limits.h> <climits> .

        2
  •  25
  •   Thanatos    11 年前

    在C99中,您只需检查预处理器符号 __STDC_IEC_559__ 定义。如果是,那么你就可以保证 double 将是一个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++的所有口味中都有。

        3
  •  7
  •   MSalters    16 年前

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

        4
  •  6
  •   Edouard A.    16 年前

    我认为你不应该把注意力放在你的双精度的“原始大小”上(通常是80位,而不是64位),而应该放在它的精度上。

    由于数字限制::digits10,这相当容易。

        5
  •  5
  •   Mihai Limbășan    16 年前

    你可以使用 Boost static assertions 这样做。看看 Use at namespace scope 例子。

        6
  •  4
  •   Mykola Golubyev    16 年前

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

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

    如果double不是64位,那么代码看起来像

    char a[0];
    

    这是编译时错误。只需将适当的注释放在本说明附近。

        7
  •  1
  •   plinth    16 年前

    this post 对于类似的问题和称为ccassert的非增强编译时断言。