2016-03-30 26 views
0

IEEE 745倍精度と単精度の数値で作業する必要があります。 私はそれらを正しく扱う方法がわかりません。C - IEEE 754の倍精度と単精度の格納方法

私は、バイナリデータのバッファを持っていると私は

uint8_t bufer[] = {................}; 
//data I want are at 8th position, (IEEE745_t is my imaginary format) 
IEEE745double_t first8bytes = *(IEEE745double_t*)(buffer + 8); 
IEEE745single_t next4bytes = *(IEEE745single_t*)(buffer + 16); 

のような数字は、私がIEE745double_tIEEE745single_tの代わりに何を置くかを取得したいですか?それはダブルとフロートで行うことは可能ですか?もしそうなら、どうすれば各プラットフォームで8バイトと4バイトの長さになるのでしょうか?

+0

サーフィンGoogleは、私が(_ [この記事を]見つけることができたhttp://www.technical-recipes.com/2012/converting-between-binary-and-decimal IEEE 754バイナリを浮動小数点数に変換することについて話している他のいくつかは – ryyker

+0

私もそれを発見しました...解決しません私の問題は...フロートをdecに変換することは基本的なことです。またはmabye私はそれを誤解したので、私を訂正してください – Charlestone

答えて

3

まず、ポインタキャストハックを実行することはできません。あなたのバイトバッファが正しく位置合わせされているという保証は全くありません。この結果、は未定義の動作になります。代わりにmemcpyを使用してください:

memcpy(&first8bytes, &buffer[8], 8); 
memcpy(&next4bytes, &buffer[16], 4); 

私はIEE745double_tIEEE745single_tの代わりに何を入れますか?それはダブルとフロートで行うことは可能ですか?

はい、それが可能だ、場合:

  • doublefloatは4つのバイトとの両方を使用IEEE754プレゼンテーションで、8バイトです。
  • bufferのデータは、ホストと同じバイトオーダーを使用します。そうでない場合は、エンディアンを修正する一時的な符号なし整数型に最初にコピーする必要があります。

もしそうなら、すべてのプラットフォームで8バイトと4バイトの長さになることをどうすれば保証できますか?

静的アサーションを使用して、それが検出されないときを検出します。たとえば、次のように数分間

static_assert(sizeof(float) == 4, "invalid float size"); 
+0

@chuxが修正されました。ありがとう。 – user694733

+0

よろしくお願い致します。私はあなたが正しくバッファを整列させることによって何を意味するのかわかりません、もっと説明してください。 – Charlestone

+1

@Charlestone多くのCPUには、例えば32ビットタイプは4で割り切れるアドレスから始まり、16ビットタイプは2で割り切れるという制限があります。バッファのランダムな位置から逆参照すると、 。これは、異なるポインタ型のエイリアシングがC言語では大抵不正である理由の1つです。これらの場合にコンパイラの警告が無効になるため、注意してキャスティングを使用してください。 – user694733

関連する問題