私の C++ プログラムでは、外部バイト シーケンスから 64 ビット float を取得する必要があります。コンパイル時に double が 64 ビットであることを確認する方法はありますか? 代わりにデータを保存するために使用する必要がある他のタイプはありますか?
編集: これを読んでいて、実際にIEEE 754 形式でのストレージを確保する方法を探している場合は、以下の Adam Rosenfield の回答をご覧ください。
私の C++ プログラムでは、外部バイト シーケンスから 64 ビット float を取得する必要があります。コンパイル時に double が 64 ビットであることを確認する方法はありますか? 代わりにデータを保存するために使用する必要がある他のタイプはありますか?
編集: これを読んでいて、実際にIEEE 754 形式でのストレージを確保する方法を探している場合は、以下の Adam Rosenfield の回答をご覧ください。
__STDC_IEC_559__
C99では、プリプロセッサシンボルが定義されているかどうかを確認できます。double
そうである場合、aはIEEE 754(IEC 60559とも呼ばれます)形式で表される8バイトの値になることが保証されます。C99標準のAnnexFを参照してください。ただし、この記号が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++ 実装が標準 double をサポートしているかどうかを知る必要があるかどうかを確認してください。これにより、合計ビット数が 64 であることが保証されるだけでなく、double 内のすべてのフィールドのサイズと位置も保証されます。
double の「生のサイズ」(通常は 64 ビットではなく 80 ビット) ではなく、その精度に注目すべきだと思います。
numeric_limits::digits10 のおかげで、これはかなり簡単です。
ブーストなしの解決策は、そのように配列を定義することです
char a[ 8 == sizeof(double) ];
double が 64 ビットでない場合、コードは次のようになります。
char a[0];
これはコンパイル時エラーです。この指示の近くに適切なコメントを入れてください。
これを行うには、 Boost 静的アサーションを使用できます。Use at namespace scopeの例を見てください。
同様の問題と CCASSERT と呼ばれる非ブースト コンパイル時間アサーションについては、この投稿を参照してください。