実数を概算する方法はたくさんあります。一部のビットが指数を表し、他の一部のビットが係数を表す浮動小数点表現があり、一部のビットが整数部分を表し、一部のビットが派閥部分を表す固定小数点表現があり、任意の有限精度表現があります。一部のベースの「数字」などが格納され、一般的な表現クラスごとに、その表現をfloat
sに変換するときに重要となるさまざまな詳細があります。
あなたの質問は、バイト配列に含まれる表現を指定していません。配列を指定してもIpp8u
、必要な情報を提供することはできません。
おそらく意味するのは、バイト配列には、マシンのネイティブ表現であるfloat
s(おそらくIEEE-754)のバイト表現が含まれており、エンディアンが最大で異なるということです。
char
配列からfloatの配列にデータのmemcpyを実行するだけです。
char c[10 * sizeof(float)] = {...};
float f[10];
std::memcpy(f, c, 10 * sizeof(float)); // or you can search for an implementation of bit_cast
してはいけないことの1つは、char
配列を単純にキャストすることです。おそらく、よりも厳密な配置要件がfloat *f = reinterpret_cast<float*>(c);
あるため、このキャストはおそらく未定義の動作をします。float
char
エンディアンが異なる場合は、最初にバイト配列を調べて、次のようにバイトを並べ替えます。
// assuming sizeof(float) == sizeof(uint32_t)
for (int i; i<sizeof c; i+=sizeof(float)) {
uint32_t i;
std::memcpy(&i, c + i, sizeof(uint32_t));
ntoh(i); // swaps bytes from Network TO Host order.
std::memcpy(c + i, &i, sizeof(uint32_t));
}