in FixAntenna/NetCore/Message/Format/DoubleFormatter.cs [702:775]
internal static double AsDouble(long value, int exp, bool negative, int decimalPlaces)
{
if (decimalPlaces > 0 && value < long.MaxValue / 2)
{
if (value < long.MaxValue / (1L << 32))
{
exp -= 32;
value <<= 32;
}
if (value < long.MaxValue / (1L << 16))
{
exp -= 16;
value <<= 16;
}
if (value < long.MaxValue / (1L << 8))
{
exp -= 8;
value <<= 8;
}
if (value < long.MaxValue / (1L << 4))
{
exp -= 4;
value <<= 4;
}
if (value < long.MaxValue / (1L << 2))
{
exp -= 2;
value <<= 2;
}
if (value < long.MaxValue / (1L << 1))
{
exp -= 1;
value <<= 1;
}
}
for (; decimalPlaces > 0; decimalPlaces--)
{
exp--;
var mod = value % 5;
value /= 5;
var modDiv = 1;
if (value < long.MaxValue / (1L << 4))
{
exp -= 4;
value <<= 4;
modDiv <<= 4;
}
if (value < long.MaxValue / (1L << 2))
{
exp -= 2;
value <<= 2;
modDiv <<= 2;
}
if (value < long.MaxValue / (1L << 1))
{
exp -= 1;
value <<= 1;
modDiv <<= 1;
}
value += modDiv * mod / 5;
}
var d = value * Math.Pow(2, exp);
return negative ? -d : d;
}