ネットワーク上で浮動小数点数のシリアライズを行うコードが見つかりました。ネットワーク上で浮動小数点数をシリアル化する方法は?
uint32_t htonf(float f)
{
uint32_t p;
uint32_t sign;
if (f < 0) { sign = 1; f = -f; }
else { sign = 0; }
p = ((((uint32_t)f)&0x7fff)<<16) | (sign<<31); // whole part and sign
p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff; // fraction
return p;
}
仕様:上記のコードは32ビット数でフロートを格納する単純な実装の一種です。上位ビット(31)は数字の符号( "1"は負)を格納するために使用され、次の7ビット(30-16)は浮動小数点数の全部を格納するために使用されます。最後に、残りのビット(15-0)を使用して、数値の小数部分を格納する。
その他はうまくいきますが、これが何を意味するのかわかりません。これはどのようにして15-0ビットを得るのですか?なぜ「* 65536.0f」が必要なのですか?
p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff
誰でもこれについて説明できますか?
あなたは何を達成しようとしていますか?両側のマシンが同じフォーマットを使用している場合や、別のマシンを処理したい場合は、これを有効にしますか?最初のケースでは、ビットを送信するだけです。 2番目の方法では、整数とスケール係数を明示的に送信し、受信側のフロートに再構成する必要があります。 –