예제 #1
0
        public double ToDouble()
        {
            if (IsNaN(this))
            {
                return(double.NaN);
            }

            if (Exponent > DoubleExpMax)
            {
                return(Mantissa > 0 ? double.PositiveInfinity : double.NegativeInfinity);
            }

            if (Exponent < DoubleExpMin)
            {
                return(0.0);
            }

            //SAFETY: again, handle 5e-324, -5e-324 separately
            if (Exponent == DoubleExpMin)
            {
                return(Mantissa > 0 ? 5e-324 : -5e-324);
            }

            var result = Mantissa * PowersOf10.Lookup(Exponent);

            if (!IsFinite(result) || Exponent < 0)
            {
                return(result);
            }

            var resultrounded = Math.Round(result);

            if (Math.Abs(resultrounded - result) < 1e-10)
            {
                return(resultrounded);
            }
            return(result);
        }