確保C ++ doubleは64ビットであります
-
09-09-2019 - |
質問
私のC ++プログラムでは、私は外部のバイト列から64ビットの浮動小数点数をプルする必要があります。コンパイル時に、確実にするいくつかの方法は、ダブルスは64ビットであること、ありますか?私が代わりにデータを格納するために使用する他のいくつかのタイプがありますか?
編集:あなたがこれを読んで、の実際のしている場合は、IEEE 754形式で保存を確保するための方法を探して、以下のアダムローゼンフィールドの答えを見てみましょう。
。解決
他の回答の改善(charは8ビットであると仮定し、標準は、これを保証しません。)。このようになります:
char a[sizeof(double) * CHAR_BIT == 64];
または
BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);
あなたは<limits.h>
または<climits>
で定義されてCHAR_BITを見つけることができます。
他のヒント
__STDC_IEC_559__
が定義されている場合は、 C99では、あなただけ確認することができます。それがある場合、あなたはdouble
は(もIEC 60559として知られている)IEEE 754形式で表現した8バイトの値になることが保証されています。 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
を確認してください。これは、ビットの合計数が64であることだけでなく保証するだけでなく、二重内のすべてのフィールドのサイズ及び位置
私はあなたが(一般的に80ビット、64ビットではないです)、あなたの二重の「生の大きさ」のではなく、その精度に焦点を当てるべきではないと思う。
のnumeric_limitsのおかげで:: digits10これはかなり簡単です。
あなたはにの静的アサーションを後押しrel="noreferrer">の使用を見てくださいするたとえばます。
ブーストせずに溶液がそうのような配列を定義することである
char a[ 8 == sizeof(double) ];
ダブルが64ビットでない場合は、、コードの意志が
のようになります。char a[0];
コンパイル時エラーとなります。ただ、この命令の近くに適切なコメントを入れています。
同様の問題と非ブーストコンパイルのためのこの記事を参照してください。時間のアサーションと呼ばCCASSERTます。