さて、C ++には、なんらかの問題なしにフロートを格納するための本当に安全な方法があるとは思いません。マシン間の移動に関しては、大容量のストレージを使用せずに効率的かつ簡単に保管できます。
非常に正確ですが、実際には非常識な値をサポートしません。どの場所でも最大7桁まで使用できますが、どちらの側でも7桁を超えることはできません。左側では、不正確な結果が表示されます。右側では、読み取り時にエラーが発生します。エラーを解決するには、書き込み中にエラーをスローするか、読み取りで「buffer [idx ++]&0x7」を実行して、0と7の境界を超えないようにします。「&0x7」は2の累乗から1を引いたものであるため、のみ機能することに注意してください。これは2^3- 1です。これは、0、1、3、7、15、31、63、127、255、511、1023などの値でのみ実行できます。
したがって、これを使用するかどうかはあなた次第です。必要なほとんどの値を取得するための安全な方法だと感じました。以下の例は、4バイト配列に変換される方法を示していますが、C++の場合はchar*になります。除算を実行したくない場合は、POWERS_OF_TEN配列を、代わりに小数と倍数の2次配列に変換できます。
const float CacheReader::POWERS_OF_TEN[] =
{
1.0F, 10.0F, 100.0F, 1000.0F, 10000.0F, 100000.0F, 1000000.0F, 10000000.0F
};
float CacheReader::readFloat(void)
{
int flags = readUnsignedByte();
int value = readUnsignedTriByte();
if (flags & 0x1)
value = -value;
return value / POWERS_OF_TEN[(flags >> 1) & 0x7];
}
unsigned __int32 CacheReader::readUnsignedTriByte(void)
{
return (readUnsignedByte() << 16) | (readUnsignedByte() << 8) | (readUnsignedByte());
}
unsigned __int8 CacheReader::readUnsignedByte(void)
{
return buffer[reader_position] & 0xFF;
}
void CacheReader::writeFloat(float data)
{
int exponent = -1;
float ceiling = 0.0F;
for ( ; ++exponent < 8; )
{
ceiling = (POWERS_OF_TEN[exponent] * data);
if (ceiling == (int)ceiling)
break;
}
exponent = exponent << 0x1;
int ceil = (int)ceiling;
if (ceil < 0)
{
exponent |= 0x1;
ceil = -ceil;
}
buffer[writer_position++] = (signed __int16)(exponent);
buffer[writer_position++] = (signed __int16)(ceil >> 16);
buffer[writer_position++] = (signed __int16)(ceil >> 8);
buffer[writer_position++] = (signed __int16)(ceil);
}