質問

私の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 ++のすべての種類が利用可能でなければなりません。

あなたは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ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top