Вот мои процедуры преобразования.Обратите внимание, что я не добавил ничего особенного для обработки бесконечности IEEE или значений NaN.
static byte[] DoubleToReal48(double d)
{
byte[] r = new byte[6];
long bits = BitConverter.DoubleToInt64Bits(d);
bool negative = ((bits >> 63) & 1) != 0;
long exponent = ((bits >> 52) & 0x7FF) - 1023;
long mantissa = bits & 0xFFFFFFFFFFFFFL;
long raw = (negative ? 1 : 0);
raw = (raw << 39) | (mantissa >> 13);
raw = (raw << 8) | ((exponent + 129) & 0xFF);
for (int k = 0; k < 6; k++)
{
r[k] = (byte)(raw & 0xFF);
raw >>= 8;
}
return r;
}
static double Real48ToDouble(byte[] r)
{
long raw = 0;
for (int k = 5; k >= 0; k--)
{
raw = (raw << 8) | r[k];
}
long mantissa = (raw << 5) & 0xFFFFFFFFFD000L;
long exponent = (((raw & 0xFF) - 129 + 1023) & 0x7FF) << 52;
long sign = (((raw & ~0x7FFFFFFFFFFFL) != 0) ? 1 : 0) << 63;
return BitConverter.Int64BitsToDouble(sign | exponent | mantissa);
}
При преобразованиях в обе стороны наблюдается некоторая потеря точности, но результаты в основном правильные.[Real48ToDouble (DoubleToReal48 (0.23)) возвращает 0.229999999999563]