public static bool TryRunSingle(float value, int requestedDigits, ref NumberBuffer number)
            {
                float v = float.IsNegative(value) ? -value : value;

                Debug.Assert(v > 0);
                Debug.Assert(float.IsFinite(v));

                int  length;
                int  decimalExponent;
                bool result;

                if (requestedDigits == -1)
                {
                    DiyFp w = DiyFp.CreateAndGetBoundaries(v, out DiyFp boundaryMinus, out DiyFp boundaryPlus).Normalize();
                    result = TryRunShortest(in boundaryMinus, in w, in boundaryPlus, number.Digits, out length, out decimalExponent);
                }
                else
                {
                    DiyFp w = new DiyFp(v).Normalize();
                    result = TryRunCounted(in w, requestedDigits, number.Digits, out length, out decimalExponent);
                }

                if (result)
                {
                    Debug.Assert((requestedDigits == -1) || (length == requestedDigits));

                    number.Scale          = length + decimalExponent;
                    number.Digits[length] = (byte)('\0');
                    number.DigitsCount    = length;
                }

                return(result);
            }
Esempio n. 2
0
            public static bool TryRunDouble(double value, int requestedDigits, ref NumberBuffer number)
            {
                var v = value.IsNegative() ? -value : value;

                Debug.Assert(v > 0);
                Debug.Assert(v.IsFinite());

                int  length;
                int  decimalExponent;
                bool result;

                if (requestedDigits == -1)
                {
                    var w = DiyFp.CreateAndGetBoundaries(v, out var boundaryMinus, out var boundaryPlus).Normalize();
                    result = TryRunShortest(in boundaryMinus, in w, in boundaryPlus, number.DigitsMut, out length, out decimalExponent);
                }
                else
                {
                    var w = new DiyFp(v).Normalize();
                    result = TryRunCounted(in w, requestedDigits, number.DigitsMut, out length, out decimalExponent);
                }

                if (!result)
                {
                    return(result);
                }
                Debug.Assert(requestedDigits == -1 || length == requestedDigits);

                number.Scale             = length + decimalExponent;
                number.DigitsMut[length] = (byte)'\0';
                number.DigitsCount       = length;

                return(result);
            }