internal static double AsDouble()

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;
		}