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