14 [StructLayout(
LayoutKind.Sequential, Pack = 1)]
17 private static readonly uint[]
s_Pow10UInt32Table =
new uint[10] { 1u, 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u };
23 1u, 100000000u, 2u, 1874919424u, 2328306u, 4u, 0u, 2242703233u, 762134875u, 1262u,
24 7u, 0u, 0u, 3211403009u, 1849224548u, 3668416493u, 3913284084u, 1593091u, 14u, 0u,
25 0u, 0u, 0u, 781532673u, 64985353u, 253049085u, 594863151u, 3553621484u, 3288652808u, 3167596762u,
26 2788392729u, 3911132675u, 590u, 27u, 0u, 0u, 0u, 0u, 0u, 0u,
27 0u, 0u, 2553183233u, 3201533787u, 3638140786u, 303378311u, 1809731782u, 3477761648u, 3583367183u, 649228654u,
28 2915460784u, 487929380u, 1011012442u, 1677677582u, 3428152256u, 1710878487u, 1438394610u, 2161952759u, 4100910556u, 1608314830u,
29 349175u, 54u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
30 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4234999809u, 2012377703u,
31 2408924892u, 1570150255u, 3090844311u, 3273530073u, 1187251475u, 2498123591u, 3364452033u, 1148564857u, 687371067u, 2854068671u,
32 1883165473u, 505794538u, 2988060450u, 3159489326u, 2531348317u, 3215191468u, 849106862u, 3892080979u, 3288073877u, 2242451748u,
33 4183778142u, 2995818208u, 2477501924u, 325481258u, 2487842652u, 1774082830u, 1933815724u, 2962865281u, 1168579910u, 2724829000u,
34 2360374019u, 2315984659u, 2360052375u, 3251779801u, 1664357844u, 28u, 107u, 0u, 0u, 0u,
35 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
36 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
37 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 689565697u,
38 4116392818u, 1853628763u, 516071302u, 2568769159u, 365238920u, 336250165u, 1283268122u, 3425490969u, 248595470u, 2305176814u,
39 2111925499u, 507770399u, 2681111421u, 589114268u, 591287751u, 1708941527u, 4098957707u, 475844916u, 3378731398u, 2452339615u,
40 2817037361u, 2678008327u, 1656645978u, 2383430340u, 73103988u, 448667107u, 2329420453u, 3124020241u, 3625235717u, 3208634035u,
41 2412059158u, 2981664444u, 4117622508u, 838560765u, 3069470027u, 270153238u, 1802868219u, 3692709886u, 2161737865u, 2159912357u,
42 2585798786u, 837488486u, 4237238160u, 2540319504u, 3798629246u, 3748148874u, 1021550776u, 2386715342u, 1973637538u, 1823520457u,
43 1146713475u, 833971519u, 3277251466u, 905620390u, 26278816u, 2680483154u, 2294040859u, 373297482u, 5996609u, 4109575006u,
44 512575049u, 917036550u, 1942311753u, 2816916778u, 3248920332u, 1192784020u, 3537586671u, 2456567643u, 2925660628u, 759380297u,
45 888447942u, 3559939476u, 3654687237u, 805u, 0u, 0u, 0u, 0u, 0u, 0u,
55 ref
BigInteger reference = ref lhs._length < rhs._length ? ref rhs : ref lhs;
56 ref
BigInteger reference2 = ref lhs._length < rhs._length ? ref lhs : ref rhs;
58 int length2 = reference2._length;
66 ulong num5 = num + reference._blocks[num2] + reference2._blocks[num3];
68 result._blocks[num4] = (uint)num5;
75 ulong num6 = num + reference._blocks[num2];
77 result._blocks[num4] = (uint)num6;
83 result._blocks[num4] = 1u;
101 for (
int num2 =
length - 1; num2 >= 0; num2--)
103 long num3 = (long)lhs._blocks[num2] - (
long)rhs._blocks[num2];
132 uint num = (uint)(
value._length - 1);
156 ulong right = rhs._blocks[0];
158 for (
int num3 = num - 1; num3 >= 0; num3--)
160 ulong left = (num2 << 32) | lhs._blocks[num3];
163 if (num4 == 0
L && num3 == num - 1)
169 quo._blocks[num3] = (uint)num4;
185 uint num7 = rhs._blocks[
length2 - 1];
186 uint num8 = rhs._blocks[
length2 - 2];
188 int num10 = 32 - num9;
191 num7 = (num7 << num9) | (num8 >> num10);
195 num8 |= rhs._blocks[
length2 - 3] >> num10;
201 uint num13 = ((num11 <
length) ? rem._blocks[num11] : 0u);
202 ulong num14 = ((ulong)num13 << 32) | rem._blocks[num11 - 1];
203 uint num15 = ((num11 > 1) ? rem._blocks[num11 - 2] : 0u);
206 num14 = (num14 << num9) | (num15 >> num10);
210 num15 |= rem._blocks[num11 - 3] >> num10;
213 ulong num16 = num14 / num7;
214 if (num16 > uint.MaxValue)
216 num16 = 4294967295uL;
233 if (num16 == 0
L && num12 == num5 - 1)
239 quo._blocks[num12] = (uint)num16;
248 for (
int num18 = num6 - 1; num18 >= 0; num18--)
250 if (rem._blocks[num18] == 0)
260 int num = divisor._length;
261 if (dividend._length < num)
266 uint num3 = dividend._blocks[num2] / (divisor._blocks[num2] + 1);
274 ulong num7 = (ulong)((
long)divisor._blocks[num4] * (long)num3) + num6;
276 ulong num8 = (ulong)((
long)dividend._blocks[num4] - (long)(uint)num7) - num5;
277 num5 = (num8 >> 32) & 1;
278 dividend._blocks[num4] = (uint)num8;
282 while (num > 0 && dividend._blocks[num - 1] == 0)
286 dividend._length = num;
288 if (
Compare(ref dividend, ref divisor) >= 0)
295 ulong num11 = (ulong)((
long)dividend._blocks[num9] - (long)divisor._blocks[num9]) - num10;
296 num10 = (num11 >> 32) & 1;
297 dividend._blocks[num9] = (uint)num11;
301 while (num > 0 && dividend._blocks[num - 1] == 0)
305 dividend._length = num;
312 if (lhs._length <= 1)
331 ulong num2 = (ulong)((
long)lhs._blocks[i] * (long)
value + num);
332 result._blocks[i] = (uint)num2;
333 num = (uint)(num2 >> 32);
337 result._blocks[i] = num;
338 result._length =
length + 1;
348 if (lhs._length <= 1)
350 Multiply(ref rhs, lhs.ToUInt32(), out result);
353 if (rhs._length <= 1)
355 Multiply(ref lhs, rhs.ToUInt32(), out result);
366 reference2 = ref lhs;
370 result.Clear((uint)num);
375 if (reference2._blocks[num2] != 0)
382 ulong num7 = (ulong)(result._blocks[num5] + (
long)reference2._blocks[num2] * (long)reference._blocks[num4]) + num6;
384 result._blocks[num5] = (uint)num7;
389 result._blocks[num5] = (uint)num6;
394 if (num > 0 && result._blocks[num - 1] == 0)
403 uint num =
DivRem32(exponent, out remainder);
404 result._length = (int)(num + 1);
409 result._blocks[num] = (uint)(1 << (
int)remainder);
420 while (exponent != 0)
422 if ((exponent & (
true ? 1u : 0u)) != 0)
429 reference2 = ref reference;
430 reference = ref reference3;
435 SetValue(out result, ref reference);
443 for (
int i = 0; i <
length2; i++)
445 ref uint reference = ref lhs._blocks[lhsStartIndex + i];
446 ulong num2 = reference + num + rhs._blocks[i];
447 reference = (uint)num2;
455 ulong num = divHi * q;
456 ulong num2 = divLo * q;
480 int num = lhs._length - lhsStartIndex;
483 for (
int i = 0; i <
length; i++)
485 num2 += rhs._blocks[i] * q;
486 uint num3 = (uint)num2;
488 ref uint reference = ref lhs._blocks[lhsStartIndex + i];
489 if (reference < num3)
511 for (
int i = 1; i <
length; i++)
513 ref uint reference = ref
_blocks[i];
546 if (
value._length <= 1)
565 ulong num4 = (num3 << 3) + (num3 << 1) + num2;
587 Pow10(exponent, out var result);
599 result._blocks[0] =
value;
605 if (
value <= uint.MaxValue)
610 result._blocks[0] = (uint)
value;
611 result._blocks[1] = (uint)(
value >> 32);
628 if (
length == 0 || shift == 0)
633 uint num =
DivRem32(shift, out remainder);
635 int num3 = num2 + (int)num;
650 uint num4 = 32 - remainder;
653 uint num7 = num6 >> (int)num4;
657 num5 = num6 << (int)remainder;
661 num7 = num6 >> (int)num4;
664 _blocks[num3 - 1] = num6 << (int)remainder;
701 remainder =
value & 0x1Fu;
708 public readonly ulong
f;
710 public readonly
int e;
756 uint num = (uint)(
f >> 32);
758 uint num3 = (uint)(
other.f >> 32);
759 uint num4 = (uint)
other.f;
760 ulong num5 = (ulong)num * (ulong)num3;
761 ulong num6 = (ulong)num2 * (ulong)num3;
762 ulong num7 = (ulong)num * (ulong)num4;
763 ulong num8 = (ulong)num2 * (ulong)num4;
764 ulong num9 = (num8 >> 32) + (uint)num7 + (uint)num6;
766 return new DiyFp(num5 + (num7 >> 32) + (num6 >> 32) + (num9 >> 32),
e +
other.e + 64);
772 return new DiyFp(
f << num,
e - num);
782 mPlus =
new DiyFp((
f << 1) + 1,
e - 1).Normalize();
783 if (
f == (ulong)(1
L << implicitBitIndex))
785 mMinus =
new DiyFp((
f << 2) - 1,
e - 2);
789 mMinus =
new DiyFp((
f << 1) - 1,
e - 1);
791 mMinus =
new DiyFp(mMinus.f << mMinus.e - mPlus.e, mPlus.e);
799 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,
800 -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,
801 -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,
802 -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,
803 -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,
804 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,
805 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,
806 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,
807 907, 933, 960, 986, 1013, 1039, 1066
812 -348, -340, -332, -324, -316, -308, -300, -292, -284, -276,
813 -268, -260, -252, -244, -236, -228, -220, -212, -204, -196,
814 -188, -180, -172, -164, -156, -148, -140, -132, -124, -116,
815 -108, -100, -92, -84, -76, -68, -60, -52, -44, -36,
816 -28, -20, -12, -4, 4, 12, 20, 28, 36, 44,
817 52, 60, 68, 76, 84, 92, 100, 108, 116, 124,
818 132, 140, 148, 156, 164, 172, 180, 188, 196, 204,
819 212, 220, 228, 236, 244, 252, 260, 268, 276, 284,
820 292, 300, 308, 316, 324, 332, 340
825 18054884314459144840uL, 13451937075301367670uL, 10022474136428063862uL, 14934650266808366570uL, 11127181549972568877uL, 16580792590934885855uL, 12353653155963782858uL, 18408377700990114895uL, 13715310171984221708uL, 10218702384817765436uL,
826 15227053142812498563uL, 11345038669416679861uL, 16905424996341287883uL, 12595523146049147757uL, 9384396036005875287uL, 13983839803942852151uL, 10418772551374772303uL, 15525180923007089351uL, 11567161174868858868uL, 17236413322193710309uL,
827 12842128665889583758uL, 9568131466127621947uL, 14257626930069360058uL, 10622759856335341974uL, 15829145694278690180uL, 11793632577567316726uL, 17573882009934360870uL, 13093562431584567480uL, 9755464219737475723uL, 14536774485912137811uL,
828 10830740992659433045uL, 16139061738043178685uL, 12024538023802026127uL, 17917957937422433684uL, 13349918974505688015uL, 9946464728195732843uL, 14821387422376473014uL, 11042794154864902060uL, 16455045573212060422uL, 12259964326927110867uL,
829 18268770466636286478uL, 13611294676837538539uL, 10141204801825835212uL, 15111572745182864684uL, 11258999068426240000uL, 16777216000000000000uL, 12500000000000000000uL, 9313225746154785156uL, 13877787807814456755uL, 10339757656912845936uL,
830 15407439555097886824uL, 11479437019748901445uL, 17105694144590052135uL, 12744735289059618216uL, 9495567745759798747uL, 14149498560666738074uL, 10542197943230523224uL, 15709099088952724970uL, 11704190886730495818uL, 17440603504673385349uL,
831 12994262207056124023uL, 9681479787123295682uL, 14426529090290212157uL, 10748601772107342003uL, 16016664761464807395uL, 11933345169920330789uL, 17782069995880619868uL, 13248674568444952270uL, 9871031767461413346uL, 14708983551653345445uL,
832 10959046745042015199uL, 16330252207878254650uL, 12166986024289022870uL, 18130221999122236476uL, 13508068024458167312uL, 10064294952495520794uL, 14996968138956309548uL, 11173611982879273257uL, 16649979327439178909uL, 12405201291620119593uL,
833 9242595204427927429uL, 13772540099066387757uL, 10261342003245940623uL, 15290591125556738113uL, 11392378155556871081uL, 16975966327722178521uL, 12648080533535911531uL
836 private static readonly uint[]
s_SmallPowersOfTen =
new uint[10] { 1u, 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u };
845 if (requestedDigits == -1)
849 flag =
TryRunShortest(in mMinus, in w, in mPlus, number.Digits, out
length, out decimalExponent);
853 diyFp =
new DiyFp(value2);
855 flag =
TryRunCounted(in w2, requestedDigits, number.Digits, out
length, out decimalExponent);
859 number.Scale =
length + decimalExponent;
860 number.Digits[
length] = 0;
861 number.DigitsCount =
length;
873 if (requestedDigits == -1)
877 flag =
TryRunShortest(in mMinus, in w, in mPlus, number.Digits, out
length, out decimalExponent);
881 diyFp =
new DiyFp(value2);
883 flag =
TryRunCounted(in w2, requestedDigits, number.Digits, out
length, out decimalExponent);
887 number.Scale =
length + decimalExponent;
888 number.Digits[
length] = 0;
889 number.DigitsCount =
length;
901 if (requestedDigits == -1)
905 flag =
TryRunShortest(in mMinus, in w, in mPlus, number.Digits, out
length, out decimalExponent);
909 diyFp =
new DiyFp(value2);
911 flag =
TryRunCounted(in w2, requestedDigits, number.Digits, out
length, out decimalExponent);
915 number.Scale =
length + decimalExponent;
916 number.Digits[
length] = 0;
917 number.DigitsCount =
length;
924 int minExponent = -60 - (w.e + 64);
925 int maxExponent = -32 - (w.e + 64);
926 int decimalExponent2;
931 decimalExponent = -decimalExponent2 + kappa;
937 int minExponent = -60 - (w.e + 64);
938 int maxExponent = -32 - (w.e + 64);
939 int decimalExponent2;
946 decimalExponent = -decimalExponent2 + kappa;
950 private static uint
BiggestPowerTen(uint number,
int numberBits, out
int exponentPlusOne)
952 int num = (numberBits + 1) * 1233 >> 12;
959 exponentPlusOne = num + 1;
967 uint num2 = (uint)(w.f >> -diyFp.
e);
968 ulong num3 = w.f & (diyFp.f - 1);
969 if (num3 == 0
L && (requestedDigits >= 11 || num2 <
s_SmallPowersOfTen[requestedDigits - 1]))
985 if (requestedDigits == 0)
991 if (requestedDigits == 0)
993 ulong rest = ((ulong)num2 << -diyFp.
e) + num3;
996 while (requestedDigits > 0 && num3 > num)
1000 uint num6 = (uint)(num3 >> -diyFp.
e);
1005 num3 &= diyFp.f - 1;
1007 if (requestedDigits != 0)
1021 DiyFp diyFp =
new DiyFp(high.f + num, high.e);
1023 DiyFp diyFp3 =
new DiyFp((ulong)(1
L << -w.e), w.e);
1024 uint num2 = (uint)(diyFp.
f >> -diyFp3.
e);
1025 ulong num3 = diyFp.f & (diyFp3.f - 1);
1035 ulong num6 = ((ulong)num2 << -diyFp3.
e) + num3;
1036 if (num6 < diyFp2.
f)
1046 diyFp2 =
new DiyFp(diyFp2.
f * 10, diyFp2.
e);
1047 uint num7 = (uint)(num3 >> -diyFp3.
e);
1051 num3 &= diyFp3.f - 1;
1053 while (num3 >= diyFp2.
f);
1059 double num =
Math.
Ceiling((
double)(minExponent + 64 - 1) * 0.3010299956639812);
1060 int num2 = (348 + (int)num - 1) / 8 + 1;
1067 if (unit >= tenKappa || tenKappa - unit <= unit)
1071 if (tenKappa - rest > rest && tenKappa - 2 * rest >= 2 * unit)
1075 if (rest > unit && (tenKappa <= rest - unit || tenKappa - (rest - unit) <= rest - unit))
1079 while (num > 0 &&
buffer[num] == 58)
1097 ulong num = distanceTooHighW - unit;
1098 ulong num2 = distanceTooHighW + unit;
1099 while (rest < num && unsafeInterval - rest >= tenKappa && (rest + tenKappa < num || num - rest >= rest + tenKappa - num))
1104 if (rest < num2 && unsafeInterval - rest >= tenKappa && (rest + tenKappa < num2 || num2 - rest > rest + tenKappa - num2))
1108 if (2 * unit <= rest)
1110 return rest <= unsafeInterval - 4 * unit;
1149 stringBuilder.
Append(
'[');
1150 stringBuilder.
Append(
'"');
1158 stringBuilder.
Append((
char)b);
1160 stringBuilder.
Append(
'"');
1166 stringBuilder.
Append(
']');
1210 public FloatingPointInfo(ushort denormalMantissaBits, ushort exponentBits,
int maxBinaryExponent,
int exponentBias, ulong infinityBits)
1239 "($#)",
"-$#",
"$-#",
"$#-",
"(#$)",
"-#$",
"#-$",
"#$-",
"-# $",
"-$ #",
1240 "# $-",
"$ #-",
"$ -#",
"#- $",
"($ #)",
"(# $)",
"$- #"
1247 "-# %",
"-#%",
"-%#",
"%-#",
"%#-",
"#-%",
"#%-",
"-% #",
"# %-",
"% #-",
1255 1f, 10f, 100f, 1000f, 10000f, 100000f, 1000000f, 10000000f, 100000000f, 1
E+09f,
1261 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0,
1262 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 1
E+17, 1
E+18, 1
E+19,
1271 bool hasUnequalMargins =
false;
1272 uint mantissaHighBitIdx;
1273 if (num2 >> 52 != 0
L)
1275 mantissaHighBitIdx = 52u;
1276 hasUnequalMargins = num2 == 4503599627370496
L;
1282 int decimalExponent;
1283 int num3 = (int)
Dragon4(num2, exponent, mantissaHighBitIdx, hasUnequalMargins, cutoffNumber, isSignificantDigits, number.Digits, out decimalExponent);
1284 number.Scale = decimalExponent + 1;
1285 number.Digits[num3] = 0;
1286 number.DigitsCount = num3;
1294 bool hasUnequalMargins =
false;
1295 uint mantissaHighBitIdx;
1298 mantissaHighBitIdx = 10u;
1299 hasUnequalMargins = num == 1024;
1305 int decimalExponent;
1306 int num2 = (int)
Dragon4(num, exponent, mantissaHighBitIdx, hasUnequalMargins, cutoffNumber, isSignificantDigits, number.Digits, out decimalExponent);
1307 number.Scale = decimalExponent + 1;
1308 number.Digits[num2] = 0;
1309 number.DigitsCount = num2;
1317 bool hasUnequalMargins =
false;
1318 uint mantissaHighBitIdx;
1319 if (num2 >> 23 != 0)
1321 mantissaHighBitIdx = 23u;
1322 hasUnequalMargins = num2 == 8388608;
1328 int decimalExponent;
1329 int num3 = (int)
Dragon4(num2, exponent, mantissaHighBitIdx, hasUnequalMargins, cutoffNumber, isSignificantDigits, number.Digits, out decimalExponent);
1330 number.Scale = decimalExponent + 1;
1331 number.Digits[num3] = 0;
1332 number.DigitsCount = num3;
1335 private unsafe
static uint
Dragon4(ulong mantissa,
int exponent, uint mantissaHighBitIdx,
bool hasUnequalMargins,
int cutoffNumber,
bool isSignificantDigits,
Span<byte> buffer, out
int decimalExponent)
1342 if (hasUnequalMargins)
1348 lhs.ShiftLeft((uint)exponent);
1367 lhs.ShiftLeft((uint)exponent);
1379 int num2 = (int)
Math.
Ceiling((
double)((int)mantissaHighBitIdx + exponent) * 0.3010299956639812 - 0.69);
1394 bool flag = mantissa % 2 == 0;
1396 if (cutoffNumber == -1)
1400 flag2 = (flag ? (num3 >= 0) : (num3 > 0));
1419 int num4 = num2 -
buffer.Length;
1420 if (cutoffNumber != -1)
1423 num5 = ((!isSignificantDigits) ? (-cutoffNumber) : (num2 - cutoffNumber));
1429 num2 = (decimalExponent = num2 - 1);
1431 if (block < 8 || block > 429496729)
1434 uint shift = (59 - num6) % 32;
1446 if (cutoffNumber == -1)
1464 if (flag3 || flag4 || num2 == num4)
1468 buffer[num] = (byte)(48 + num7);
1471 result.Multiply10();
1484 if (num7 > 5 || (num7 == 5 && !lhs.IsZero()))
1489 buffer[num] = (byte)(48 + num7);
1490 return (uint)(num + 1);
1497 if (lhs.IsZero() || num2 <= num4)
1501 buffer[num] = (byte)(48 + num7);
1515 flag5 = (num7 & 1) == 0;
1520 buffer[num] = (byte)(48 + num7);
1545 buffer[num] = (byte)(48 + num7 + 1);
1555 byte* digits2 = stackalloc
byte[31];
1558 char*
pointer = stackalloc
char[32];
1575 byte* digits2 = stackalloc
byte[31];
1578 char*
pointer = stackalloc
char[32];
1593 byte* digitsPointer = number.GetDigitsPointer();
1594 number.DigitsCount = 29;
1595 number.IsNegative = d.IsNegative;
1596 byte* bufferEnd = digitsPointer + 29;
1597 while ((d.Mid | d.High) != 0)
1602 int num = (number.DigitsCount = (int)(digitsPointer + 29 - bufferEnd));
1603 number.Scale = num - d.Scale;
1604 byte* digitsPointer2 = number.GetDigitsPointer();
1607 *(digitsPointer2++) = *(bufferEnd++);
1609 *digitsPointer2 = 0;
1614 Span<char> initialBuffer = stackalloc
char[32];
1621 Span<char> initialBuffer = stackalloc
char[32];
1635 isSignificantDigits =
true;
1638 int result = precision;
1643 if (precision == -1)
1645 precision =
info.CurrencyDecimalDigits;
1647 isSignificantDigits =
false;
1651 if (precision == -1)
1656 isSignificantDigits =
true;
1662 if (precision == -1)
1664 precision =
info.NumberDecimalDigits;
1666 isSignificantDigits =
false;
1674 isSignificantDigits =
true;
1678 if (precision == -1)
1680 precision =
info.PercentDecimalDigits;
1683 isSignificantDigits =
false;
1688 isSignificantDigits =
true;
1698 if (!
double.IsFinite(
value))
1700 if (
double.IsNaN(
value))
1702 return info.NaNSymbol;
1704 if (!
double.IsNegative(
value))
1706 return info.PositiveInfinitySymbol;
1708 return info.NegativeInfinitySymbol;
1712 byte* digits2 = stackalloc
byte[769];
1718 number.IsNegative =
double.IsNegative(
value);
1719 bool isSignificantDigits;
1742 Span<char> initialBuffer = stackalloc
char[32];
1749 Span<char> initialBuffer = stackalloc
char[32];
1761 if (!
float.IsFinite(
value))
1763 if (
float.IsNaN(
value))
1765 return info.NaNSymbol;
1767 if (!
float.IsNegative(
value))
1769 return info.PositiveInfinitySymbol;
1771 return info.NegativeInfinitySymbol;
1775 byte* digits2 = stackalloc
byte[114];
1781 number.IsNegative =
float.IsNegative(
value);
1782 bool isSignificantDigits;
1805 Span<char> initialBuffer = stackalloc
char[32];
1816 return info.NaNSymbol;
1820 return info.PositiveInfinitySymbol;
1822 return info.NegativeInfinitySymbol;
1826 byte* digits2 = stackalloc
byte[21];
1833 bool isSignificantDigits;
1856 Span<char> initialBuffer = stackalloc
char[32];
1870 charsWritten =
source.Length;
1879 return (
char)(fmt - 33);
1884 if (
string.IsNullOrEmpty(
format))
1892 return FormatInt32Slow(
value, hexMask,
format, provider);
1898 char c2 = (char)(c & 0xFFDFu);
1899 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
1912 byte* digits2 = stackalloc
byte[11];
1915 char*
pointer = stackalloc
char[32];
1944 char c2 = (char)(c & 0xFFDFu);
1945 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
1958 byte* digits2 = stackalloc
byte[11];
1961 char*
pointer = stackalloc
char[32];
1977 if (
string.IsNullOrEmpty(
format))
1987 char c2 = (char)(c & 0xFFDFu);
1988 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
1997 byte* digits2 = stackalloc
byte[11];
2000 char*
pointer = stackalloc
char[32];
2025 char c2 = (char)(c & 0xFFDFu);
2026 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
2035 byte* digits2 = stackalloc
byte[11];
2038 char*
pointer = stackalloc
char[32];
2054 if (
string.IsNullOrEmpty(
format))
2068 char c2 = (char)(c & 0xFFDFu);
2069 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
2082 byte* digits2 = stackalloc
byte[20];
2085 char*
pointer = stackalloc
char[32];
2114 char c2 = (char)(c & 0xFFDFu);
2115 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
2128 byte* digits2 = stackalloc
byte[20];
2131 char*
pointer = stackalloc
char[32];
2147 if (
string.IsNullOrEmpty(
format))
2157 char c2 = (char)(c & 0xFFDFu);
2158 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
2167 byte* digits2 = stackalloc
byte[21];
2170 char*
pointer = stackalloc
char[32];
2195 char c2 = (char)(c & 0xFFDFu);
2196 if ((c2 ==
'G') ? (digits < 1) : (c2 ==
'D'))
2205 byte* digits2 = stackalloc
byte[21];
2208 char*
pointer = stackalloc
char[32];
2225 number.DigitsCount = 10;
2228 number.IsNegative =
false;
2232 number.IsNegative =
true;
2235 byte* digitsPointer = number.GetDigitsPointer();
2237 int num = (number.Scale = (number.DigitsCount = (int)(digitsPointer + 10 - ptr)));
2238 byte* digitsPointer2 = number.GetDigitsPointer();
2241 *(digitsPointer2++) = *(ptr++);
2243 *digitsPointer2 = 0;
2262 string text =
string.FastAllocateString(num);
2263 fixed (
char* ptr =
text)
2266 for (
int num2 = sNegative.Length - 1; num2 >= 0; num2--)
2268 *(--ptr2) = sNegative[num2];
2290 for (
int num2 = sNegative.Length - 1; num2 >= 0; num2--)
2292 *(--ptr2) = sNegative[num2];
2305 string text =
string.FastAllocateString(num);
2306 fixed (
char* ptr =
text)
2335 while (--digits >= 0 ||
value != 0)
2337 byte b = (byte)(
value & 0xFu);
2338 *(--
buffer) = (
char)(b + ((b < 10) ? 48 : hexBase));
2347 number.DigitsCount = 10;
2348 number.IsNegative =
false;
2349 byte* digitsPointer = number.GetDigitsPointer();
2351 int num = (number.Scale = (number.DigitsCount = (int)(digitsPointer + 10 - ptr)));
2352 byte* digitsPointer2 = number.GetDigitsPointer();
2355 *(digitsPointer2++) = *(ptr++);
2357 *digitsPointer2 = 0;
2362 while (--digits >= 0 ||
value != 0)
2366 *(--bufferEnd) = (
byte)(num + 48);
2373 while (--digits >= 0 ||
value != 0)
2377 *(--bufferEnd) = (
char)(num + 48);
2389 string text =
string.FastAllocateString(num);
2390 fixed (
char* ptr =
text)
2392 char* ptr2 = ptr + num;
2397 *(--ptr2) = (
char)(num2 + 48);
2411 string text =
string.FastAllocateString(num);
2412 fixed (
char* ptr =
text)
2414 char* bufferEnd = ptr + num;
2431 char* ptr2 = ptr + num;
2438 *(--ptr2) = (
char)(num2 + 48);
2453 number.IsNegative =
input < 0;
2454 number.DigitsCount = 19;
2455 if (number.IsNegative)
2459 byte* digitsPointer = number.GetDigitsPointer();
2460 byte* bufferEnd = digitsPointer + 19;
2466 int num = (number.Scale = (number.DigitsCount = (int)(digitsPointer + 19 - bufferEnd)));
2467 byte* digitsPointer2 = number.GetDigitsPointer();
2470 *(digitsPointer2++) = *(bufferEnd++);
2472 *digitsPointer2 = 0;
2492 string text =
string.FastAllocateString(num);
2493 fixed (
char* ptr =
text)
2495 char* bufferEnd = ptr + num;
2502 for (
int num2 = sNegative.Length - 1; num2 >= 0; num2--)
2504 *(--bufferEnd) = sNegative[num2];
2526 char* bufferEnd = ptr + num;
2533 for (
int num2 = sNegative.Length - 1; num2 >= 0; num2--)
2535 *(--bufferEnd) = sNegative[num2];
2544 string text =
string.FastAllocateString(num);
2545 fixed (
char* ptr =
text)
2547 char*
buffer = ptr + num;
2572 char*
buffer = ptr + num;
2588 number.DigitsCount = 20;
2589 number.IsNegative =
false;
2590 byte* digitsPointer = number.GetDigitsPointer();
2591 byte* bufferEnd = digitsPointer + 20;
2597 int num = (number.Scale = (number.DigitsCount = (int)(digitsPointer + 20 - bufferEnd)));
2598 byte* digitsPointer2 = number.GetDigitsPointer();
2601 *(digitsPointer2++) = *(bufferEnd++);
2603 *digitsPointer2 = 0;
2617 string text =
string.FastAllocateString(num);
2618 fixed (
char* ptr =
text)
2620 char* bufferEnd = ptr + num;
2646 char* bufferEnd = ptr + num;
2663 if ((uint)(c - 65) <= 25u || (uint)(c - 97) <= 25u)
2672 int num =
format[1] - 48;
2673 if ((uint)num < 10u)
2679 else if (
format.Length == 3)
2681 int num2 =
format[1] - 48;
2682 int num3 =
format[2] - 48;
2683 if ((uint)num2 < 10u && (uint)num3 < 10u)
2685 digits = num2 * 10 + num3;
2691 while (num5 <
format.Length && (uint)(
format[num5] - 48) < 10u)
2693 int num6 = num4 * 10 +
format[num5++] - 48;
2708 if (
format.Length != 0 && c != 0)
2718 bool bSuppressScientific;
2725 nMaxDigits =
info.CurrencyDecimalDigits;
2727 RoundNumber(ref number, number.Scale + nMaxDigits, isCorrectlyRounded);
2734 nMaxDigits =
info.NumberDecimalDigits;
2736 RoundNumber(ref number, number.Scale + nMaxDigits, isCorrectlyRounded);
2737 if (number.IsNegative)
2739 sb.Append(
info.NegativeSign);
2741 FormatFixed(ref sb, ref number, nMaxDigits,
null,
info.NumberDecimalSeparator,
null);
2747 nMaxDigits =
info.NumberDecimalDigits;
2749 RoundNumber(ref number, number.Scale + nMaxDigits, isCorrectlyRounded);
2759 RoundNumber(ref number, nMaxDigits, isCorrectlyRounded);
2760 if (number.IsNegative)
2762 sb.Append(
info.NegativeSign);
2768 bSuppressScientific =
false;
2773 bSuppressScientific =
true;
2774 if (number.Digits[0] != 0)
2780 nMaxDigits = number.DigitsCount;
2782 RoundNumber(ref number, nMaxDigits, isCorrectlyRounded);
2788 nMaxDigits =
info.PercentDecimalDigits;
2791 RoundNumber(ref number, number.Scale + nMaxDigits, isCorrectlyRounded);
2805 if (number.IsNegative)
2807 sb.Append(
info.NegativeSign);
2820 byte* digitsPointer = number.GetDigitsPointer();
2821 int num2 =
FindSection(
format, (*digitsPointer == 0) ? 2 : (number.IsNegative ? 1 : 0));
2833 num5 =
int.MaxValue;
2843 while (num9 <
format.Length && (c = ptr[num9++]) != 0)
2853 if (num5 ==
int.MaxValue)
2867 if (num3 <= 0 || num4 >= 0)
2891 while (num9 <
format.Length && ptr[num9] != 0 && ptr[num9++] != c)
2896 if (num9 <
format.Length && ptr[num9] != 0)
2903 if ((num9 <
format.Length && ptr[num9] ==
'0') || (num9 + 1 <
format.Length && (ptr[num9] ==
'+' || ptr[num9] ==
'-') && ptr[num9 + 1] ==
'0'))
2905 while (++num9 <
format.Length && ptr[num9] ==
'0')
2932 if (*digitsPointer != 0)
2934 number.Scale += num8;
2935 int pos = (flag ? num3 : (number.Scale + num3 - num4));
2936 RoundNumber(ref number, pos, isCorrectlyRounded:
false);
2937 if (*digitsPointer != 0)
2951 number.IsNegative =
false;
2956 num5 = ((num5 < num4) ? (num4 - num5) : 0);
2957 num6 = ((num6 > num4) ? (num4 - num6) : 0);
2967 num10 = ((number.Scale > num4) ? number.Scale : num4);
2968 num11 = number.Scale - num4;
2973 if (flag2 &&
info.NumberGroupSeparator.Length > 0)
2975 int[] numberGroupSizes =
info._numberGroupSizes;
2978 int num14 = numberGroupSizes.Length;
2981 i = numberGroupSizes[num13];
2984 int num16 = num10 + ((num11 < 0) ? num11 : 0);
2985 for (
int num17 = ((num5 > num16) ? num5 : num16); num17 > i; i += num15)
2992 if (num12 >= span.
Length)
2994 int[]
array =
new int[span.Length * 2];
2999 if (num13 < num14 - 1)
3002 num15 = numberGroupSizes[num13];
3006 if (number.IsNegative && num2 == 0 && number.Scale != 0)
3008 sb.Append(
info.NegativeSign);
3013 byte* ptr2 = digitsPointer;
3015 while (num9 <
format.Length && (c = ptr3[num9++]) != 0 && c !=
';')
3017 if (num11 > 0 && (c ==
'#' || c ==
'.' || c ==
'0'))
3021 sb.Append((
char)((*ptr2 != 0) ? (*(ptr2++)) : 48));
3022 if (flag2 && num10 > 1 && num12 >= 0 && num10 == span[num12] + 1)
3024 sb.Append(
info.NumberGroupSeparator);
3038 c = ((num10 <= num5) ?
'0' :
'\0');
3042 c = ((*ptr2 != 0) ? ((
char)(*(ptr2++))) : ((num10 > num6) ?
'0' :
'\0'));
3047 if (flag2 && num10 > 1 && num12 >= 0 && num10 == span[num12] + 1)
3049 sb.Append(
info.NumberGroupSeparator);
3056 if (!(num10 != 0 || flag3) && (num6 < 0 || (num4 < num3 && *ptr2 != 0)))
3058 sb.Append(
info.NumberDecimalSeparator);
3063 sb.Append(
info.PerMilleSymbol);
3066 sb.Append(
info.PercentSymbol);
3070 while (num9 <
format.Length && ptr3[num9] != 0 && ptr3[num9] != c)
3072 sb.Append(ptr3[num9++]);
3074 if (num9 <
format.Length && ptr3[num9] != 0)
3080 if (num9 <
format.Length && ptr3[num9] != 0)
3082 sb.Append(ptr3[num9++]);
3088 bool positiveSign =
false;
3092 if (num9 <
format.Length && ptr3[num9] ==
'0')
3096 else if (num9 + 1 <
format.Length && ptr3[num9] ==
'+' && ptr3[num9 + 1] ==
'0')
3098 positiveSign =
true;
3100 else if (num9 + 1 >=
format.Length || ptr3[num9] !=
'-' || ptr3[num9 + 1] !=
'0')
3105 while (++num9 <
format.Length && ptr3[num9] ==
'0')
3113 int value = ((*digitsPointer != 0) ? (number.Scale - num4) : 0);
3119 if (num9 <
format.Length)
3121 if (ptr3[num9] ==
'+' || ptr3[num9] ==
'-')
3123 sb.Append(ptr3[num9++]);
3125 while (num9 <
format.Length && ptr3[num9] ==
'0')
3127 sb.Append(ptr3[num9++]);
3140 if (number.IsNegative && num2 == 0 && number.Scale == 0 && sb.Length > 0)
3142 sb.Insert(0,
info.NegativeSign);
3149 string text2 =
text;
3150 foreach (
char c
in text2)
3155 FormatFixed(ref sb, ref number, nMaxDigits,
info._currencyGroupSizes,
info.CurrencyDecimalSeparator,
info.CurrencyGroupSeparator);
3158 sb.Append(
info.NegativeSign);
3161 sb.Append(
info.CurrencySymbol);
3172 int num = number.Scale;
3173 byte* ptr = number.GetDigitsPointer();
3176 if (groupDigits !=
null)
3181 if (groupDigits.Length != 0)
3183 int num5 = groupDigits[num2];
3184 while (num > num5 && groupDigits[num2] != 0)
3186 num3 += sGroup.Length;
3187 if (num2 < groupDigits.Length - 1)
3191 num5 += groupDigits[num2];
3192 if (num5 < 0 || num3 < 0)
3197 num4 = ((num5 != 0) ? groupDigits[0] : 0);
3201 int digitsCount = number.DigitsCount;
3202 int num7 = ((num < digitsCount) ? num : digitsCount);
3203 fixed (
char* ptr2 = &
MemoryMarshal.GetReference(sb.AppendSpan(num3)))
3205 char* ptr3 = ptr2 + num3 - 1;
3206 for (
int num8 = num - 1; num8 >= 0; num8--)
3208 *(ptr3--) = (
char)((num8 < num7) ? ptr[num8] : 48);
3212 if (num6 == num4 && num8 != 0)
3214 for (
int num9 = sGroup.Length - 1; num9 >= 0; num9--)
3216 *(ptr3--) = sGroup[num9];
3218 if (num2 < groupDigits.Length - 1)
3221 num4 = groupDigits[num2];
3234 sb.Append((
char)((*ptr != 0) ? (*(ptr++)) : 48));
3245 sb.Append(sDecimal);
3246 if (num < 0 && nMaxDigits > 0)
3248 int num10 =
Math.
Min(-num, nMaxDigits);
3249 sb.Append(
'0', num10);
3251 nMaxDigits -= num10;
3253 while (nMaxDigits > 0)
3255 sb.Append((
char)((*ptr != 0) ? (*(ptr++)) : 48));
3264 string text2 =
text;
3265 foreach (
char c
in text2)
3270 FormatFixed(ref sb, ref number, nMaxDigits,
info._numberGroupSizes,
info.NumberDecimalSeparator,
info.NumberGroupSeparator);
3273 sb.Append(
info.NegativeSign);
3284 byte* digitsPointer = number.GetDigitsPointer();
3285 sb.Append((
char)((*digitsPointer != 0) ? (*(digitsPointer++)) : 48));
3286 if (nMaxDigits != 1)
3288 sb.Append(
info.NumberDecimalSeparator);
3290 while (--nMaxDigits > 0)
3292 sb.Append((
char)((*digitsPointer != 0) ? (*(digitsPointer++)) : 48));
3294 int value = ((number.Digits[0] != 0) ? (number.Scale - 1) : 0);
3303 sb.Append(
info.NegativeSign);
3306 else if (positiveSign)
3308 sb.Append(
info.PositiveSign);
3310 char* ptr = stackalloc
char[10];
3312 sb.Append(ptr2, (
int)(ptr + 10 - ptr2));
3317 int i = number.Scale;
3319 if (!bSuppressScientific && (i > nMaxDigits || i < -3))
3324 byte* digitsPointer = number.GetDigitsPointer();
3329 sb.Append((
char)((*digitsPointer != 0) ? (*(digitsPointer++)) : 48));
3337 if (*digitsPointer != 0 || i < 0)
3339 sb.Append(
info.NumberDecimalSeparator);
3344 while (*digitsPointer != 0)
3346 sb.Append((
char)(*(digitsPointer++)));
3358 string text2 =
text;
3359 foreach (
char c
in text2)
3364 FormatFixed(ref sb, ref number, nMaxDigits,
info._percentGroupSizes,
info.PercentDecimalSeparator,
info.PercentGroupSeparator);
3367 sb.Append(
info.NegativeSign);
3370 sb.Append(
info.PercentSymbol);
3381 byte* digitsPointer = number.GetDigitsPointer();
3383 for (j = 0; j < pos && digitsPointer[j] != 0; j++)
3386 if (j == pos &&
ShouldRoundUp(digitsPointer, j, number.Kind, isCorrectlyRounded))
3388 while (j > 0 && digitsPointer[j - 1] == 57)
3394 byte* num = digitsPointer + (j - 1);
3400 *digitsPointer = 49;
3406 while (j > 0 && digitsPointer[j - 1] == 48)
3415 number.IsNegative =
false;
3419 digitsPointer[j] = 0;
3420 number.DigitsCount = j;
3424 if (b == 0 || isCorrectlyRounded)
3443 if (num >=
format.Length)
3448 char c2 = (c = ptr[num++]);
3449 if ((uint)c2 <= 34u)
3460 else if (c2 !=
'\'')
3467 if (num <
format.Length && ptr[num] != 0)
3477 if (num >=
format.Length || ptr[num] ==
'\0' || ptr[num] ==
';')
3485 while (num <
format.Length && ptr[num] != 0 && ptr[num++] != c)
3500 return (uint)((
value & 0xFFFFFFFF00000000uL) >> 32);
3505 uint result = (uint)(
value % 1000000000);
3506 value /= 1000000000uL;
3513 ulong num2 = num & 0xFFFFFFFFFFFFFuL;
3514 exponent = (int)(num >> 52) & 0x7FF;
3517 num2 |= 0x10000000000000uL;
3530 ushort num2 = (ushort)(num & 0x3FFu);
3531 exponent = (num >> 10) & 0x1F;
3534 num2 = (ushort)(num2 | 0x400u);
3547 uint num2 = num & 0x7FFFFFu;
3548 exponent = (int)((num >> 23) & 0xFF);
3564 byte* ptr = number.GetDigitsPointer() + firstIndex;
3565 uint num = lastIndex - firstIndex;
3568 uint num2 =
Math.
Min(num, 9u);
3570 result.MultiplyPow10(num2);
3580 int num2 = (int)(
info.NormalMantissaBits - num);
3581 int num3 = initialExponent - num2;
3582 ulong num4 = initialMantissa;
3584 if (num3 >
info.MaxBinaryExponent)
3586 return info.InfinityBits;
3588 if (num3 <
info.MinBinaryExponent)
3590 int num6 = num2 + num3 + info.ExponentBias - 1;
3591 num5 = -
info.ExponentBias;
3597 return info.ZeroBits;
3599 if (num4 >
info.DenormalMantissaMask)
3601 num5 = initialExponent - (num6 + 1) - num2;
3612 if (num4 >
info.NormalMantissaMask)
3616 if (num5 >
info.MaxBinaryExponent)
3618 return info.InfinityBits;
3626 num4 &=
info.DenormalMantissaMask;
3627 ulong num7 = (ulong)((
long)(num5 +
info.ExponentBias) << (
int)
info.DenormalMantissaBits);
3633 int denormalMantissaBits =
info.DenormalMantissaBits;
3634 if (integerBitsOfPrecision <= 64)
3638 (uint Quotient, uint Remainder) tuple =
Math.
DivRem(integerBitsOfPrecision, 32u);
3639 uint
item = tuple.Quotient;
3640 uint item2 = tuple.Remainder;
3641 uint num =
item - 1;
3642 uint num2 = num - 1;
3643 int num3 = denormalMantissaBits + (int)(num2 * 32);
3644 bool flag = !hasNonZeroFractionalPart;
3645 ulong initialMantissa;
3648 initialMantissa = ((ulong)
value.GetBlock(num) << 32) +
value.GetBlock(num2);
3652 int num4 = (int)item2;
3653 int num5 = 64 - num4;
3654 int num6 = num5 - 32;
3656 uint block =
value.GetBlock(num2);
3657 uint num7 = block >> num4;
3658 ulong num8 = (ulong)
value.GetBlock(num) << num6;
3659 ulong num9 = (ulong)
value.GetBlock(
item) << num5;
3660 initialMantissa = num9 + num8 + num7;
3661 uint num10 = (uint)((1 << (
int)item2) - 1);
3662 flag = flag && (block & num10) == 0;
3664 for (uint num11 = 0u; num11 != num2; num11++)
3666 flag &=
value.GetBlock(num11) == 0;
3673 byte* ptr = p +
count;
3674 uint num = (uint)(*p - 48);
3675 for (p++; p < ptr; p++)
3677 num = 10 * num + *p - 48;
3684 byte* ptr = p +
count;
3685 ulong num = (ulong)(*p - 48);
3686 for (p++; p < ptr; p++)
3688 num = 10 * num + *p - 48;
3695 uint digitsCount = (uint)number.DigitsCount;
3696 uint num = (uint)
Math.
Max(0, number.Scale);
3697 uint num2 =
Math.
Min(num, digitsCount);
3698 uint num3 = digitsCount - num2;
3699 uint num4 = (uint)
Math.
Abs(number.Scale - num2 - num3);
3700 byte* digitsPointer = number.GetDigitsPointer();
3701 if (digitsCount <= 15 && num4 <= 22)
3705 num5 = ((num3 == 0) ? (num5 * num6) : (num5 / num6));
3713 uint digitsCount = (uint)number.DigitsCount;
3714 uint num = (uint)
Math.
Max(0, number.Scale);
3715 uint num2 =
Math.
Min(num, digitsCount);
3716 uint num3 = digitsCount - num2;
3717 uint num4 = (uint)
Math.
Abs(number.Scale - num2 - num3);
3718 byte* digitsPointer = number.GetDigitsPointer();
3719 if (digitsCount <= 7 && num4 <= 10)
3723 num5 = ((num3 == 0) ? (num5 * num6) : (num5 / num6));
3726 if (digitsCount <= 15 && num4 <= 22)
3730 num7 = ((num3 == 0) ? (num7 * num8) : (num7 / num8));
3738 uint digitsCount = (uint)number.DigitsCount;
3739 uint num = (uint)
Math.
Max(0, number.Scale);
3740 uint num2 =
Math.
Min(num, digitsCount);
3741 uint num3 = digitsCount - num2;
3742 uint num4 = (uint)
Math.
Abs(number.Scale - num2 - num3);
3743 byte* digitsPointer = number.GetDigitsPointer();
3744 if (digitsCount <= 7 && num4 <= 10)
3748 num5 = ((num3 == 0) ? (num5 * num6) : (num5 / num6));
3751 if (digitsCount <= 15 && num4 <= 22)
3755 num7 = ((num3 == 0) ? (num7 * num8) : (num7 / num8));
3763 uint num = (uint)(
info.NormalMantissaBits + 1);
3764 uint digitsCount = (uint)number.DigitsCount;
3765 uint num2 = positiveExponent - integerDigitsPresent;
3766 uint lastIndex = digitsCount;
3770 if (num2 >
info.OverflowDecimalExponent)
3772 return info.InfinityBits;
3774 result.MultiplyPow10(num2);
3777 if (num3 >= num || fractionalDigitsPresent == 0)
3781 uint num4 = fractionalDigitsPresent;
3782 if (number.Scale < 0)
3784 num4 += (uint)(-number.Scale);
3786 if (num3 == 0 && num4 - (
int)digitsCount >
info.OverflowDecimalExponent)
3788 return info.ZeroBits;
3791 if (result2.IsZero())
3805 result2.ShiftLeft(num7);
3807 uint num8 = num - num3;
3822 result2.ShiftLeft(num9);
3824 ulong num11 = quo.ToUInt64();
3825 bool flag = !number.HasNonZeroTail && rem.IsZero();
3829 int num13 = (int)(num12 - num8);
3830 flag = flag && (num11 & (ulong)((1
L << num13) - 1)) == 0;
3833 ulong num14 = result.ToUInt64();
3834 ulong initialMantissa = (num14 << (int)num8) + num11;
3835 int initialExponent = (int)((num3 != 0) ? (num3 - 2) : (0 - num10 - 1));
3845 ulong num = (ulong)((1
L << shift - 1) - 1);
3846 ulong num2 = (ulong)(1
L << shift - 1);
3847 ulong num3 = (ulong)(1
L << shift);
3848 bool lsbBit = (
value & num3) != 0;
3849 bool roundBit = (
value & num2) != 0;
3850 bool hasTailBits = !hasZeroTail || (
value & num) != 0;
3851 return (
value >> shift) + (ulong)(
ShouldRoundUp(lsbBit, roundBit, hasTailBits) ? 1 : 0);
3858 return hasTailBits || lsbBit;
3865 int num = number.Scale;
3866 if (num > 10 || num < number.DigitsCount)
3870 byte* digitsPointer = number.GetDigitsPointer();
3874 if ((uint)num2 > 214748364u)
3879 if (*digitsPointer != 0)
3881 num2 += *(digitsPointer++) - 48;
3884 if (number.IsNegative)
3902 int num = number.Scale;
3903 if (num > 19 || num < number.DigitsCount)
3907 byte* digitsPointer = number.GetDigitsPointer();
3911 if ((ulong)num2 > 922337203685477580uL)
3916 if (*digitsPointer != 0)
3918 num2 += *(digitsPointer++) - 48;
3921 if (number.IsNegative)
3939 int num = number.Scale;
3940 if (num > 10 || num < number.DigitsCount || number.IsNegative)
3944 byte* digitsPointer = number.GetDigitsPointer();
3948 if (num2 > 429496729)
3953 if (*digitsPointer != 0)
3955 uint num3 = num2 + (uint)(*(digitsPointer++) - 48);
3969 int num = number.Scale;
3970 if (num > 20 || num < number.DigitsCount || number.IsNegative)
3974 byte* digitsPointer = number.GetDigitsPointer();
3978 if (num2 > 1844674407370955161
L)
3983 if (*digitsPointer != 0)
3985 ulong num3 = num2 + (ulong)(*(digitsPointer++) - 48);
4001 if (parsingStatus != 0)
4012 if (parsingStatus != 0)
4023 if (parsingStatus != 0)
4034 if (parsingStatus != 0)
4051 value2 =
info.CurrencyGroupSeparator;
4057 value2 =
info.NumberGroupSeparator;
4061 char c = ((ptr < strEnd) ? (*ptr) :
'\0');
4064 if (!
IsWhite(c) || (styles &
NumberStyles.AllowLeadingWhite) == 0 || (((uint)num & (
true ? 1u : 0u)) != 0 && (num & 0x20) == 0 &&
info.NumberNegativePattern != 2))
4072 else if (c ==
'(' && (styles &
NumberStyles.AllowParentheses) != 0 && (num & 1) == 0)
4075 number.IsNegative =
true;
4088 c = ((++ptr < strEnd) ? (*ptr) :
'\0');
4092 int num4 = number.Digits.Length - 1;
4100 if (c !=
'0' || ((uint)num & 8u) != 0)
4104 number.Digits[num2] = (byte)c;
4112 number.HasNonZeroTail =
true;
4114 if ((num & 0x10) == 0)
4120 num5 = ((c ==
'0') ? (num5 + 1) : 0);
4125 else if (((uint)num & 0x10u) != 0)
4130 else if ((styles &
NumberStyles.AllowDecimalPoint) != 0 && (num & 0x10) == 0 && ((ptr2 =
MatchChars(ptr, strEnd,
value)) !=
null || (flag && (num & 0x20) == 0 && (ptr2 =
MatchChars(ptr, strEnd,
info.NumberDecimalSeparator)) !=
null)))
4137 if ((styles &
NumberStyles.AllowThousands) == 0 || (num & 4) == 0 || ((uint)num & 0x10u) != 0 || ((ptr2 =
MatchChars(ptr, strEnd, value2)) ==
null && (!flag || ((uint)num & 0x20u) != 0 || (ptr2 =
MatchChars(ptr, strEnd,
info.NumberGroupSeparator)) ==
null)))
4143 c = ((++ptr < strEnd) ? (*ptr) :
'\0');
4146 number.DigitsCount = num3;
4147 number.Digits[num3] = 0;
4148 if (((uint)num & 4u) != 0)
4150 if ((c ==
'E' || c ==
'e') && (styles &
NumberStyles.AllowExponent) != 0)
4153 c = ((++ptr < strEnd) ? (*ptr) :
'\0');
4155 if ((ptr2 =
MatchChars(ptr, strEnd,
info._positiveSign)) !=
null)
4157 c = (((ptr = ptr2) < strEnd) ? (*ptr) :
'\0');
4161 c = (((ptr = ptr2) < strEnd) ? (*ptr) :
'\0');
4169 num6 = num6 * 10 + (c - 48);
4170 c = ((++ptr < strEnd) ? (*ptr) :
'\0');
4176 c = ((++ptr < strEnd) ? (*ptr) :
'\0');
4185 number.Scale += num6;
4190 c = ((ptr < strEnd) ? (*ptr) :
'\0');
4193 if (number.Kind ==
NumberBufferKind.FloatingPoint && !number.HasNonZeroTail)
4195 int num7 = num3 - number.Scale;
4199 number.DigitsCount = num3 - num5;
4200 number.Digits[number.DigitsCount] = 0;
4213 else if (c ==
')' && ((uint)num & 2u) != 0)
4227 c = ((++ptr < strEnd) ? (*ptr) :
'\0');
4239 number.IsNegative =
false;
4268 byte* digits = stackalloc
byte[11];
4296 if ((uint)i >= (uint)
value.Length)
4312 result = num2 * num3;
4334 if (
info.HasInvariantNumberSigns)
4340 if ((uint)i >= (uint)
value.Length)
4349 if ((uint)i >= (uint)
value.Length)
4356 else if (
info.AllowHyphenDuringParsing && num == 45)
4360 if ((uint)i >= (uint)
value.Length)
4370 string positiveSign =
info.PositiveSign;
4371 string negativeSign =
info.NegativeSign;
4372 if (!
string.IsNullOrEmpty(positiveSign) &&
value.StartsWith(positiveSign))
4374 i += positiveSign.Length;
4375 if ((uint)i >= (uint)
value.Length)
4381 else if (!
string.IsNullOrEmpty(negativeSign) &&
value.StartsWith(negativeSign))
4384 i += negativeSign.Length;
4385 if ((uint)i >= (uint)
value.Length)
4404 if ((uint)i >= (uint)
value.Length)
4424 if ((uint)i >= (uint)
value.Length)
4432 num2 = 10 * num2 + num - 48;
4438 if ((uint)i >= (uint)
value.Length)
4446 flag = num2 > 214748364;
4447 num2 = num2 * 10 + num - 48;
4448 flag = flag || (uint)num2 > (uint)(int.MaxValue + (num3 >>> 31));
4449 if ((uint)i >= (uint)
value.Length)
4458 if ((uint)i < (uint)
value.Length)
4477 if ((uint)i >= (uint)
value.Length)
4507 if ((uint)i >= (uint)
value.Length)
4523 result = num2 * num3;
4545 if (
info.HasInvariantNumberSigns)
4551 if ((uint)i >= (uint)
value.Length)
4560 if ((uint)i >= (uint)
value.Length)
4567 else if (
info.AllowHyphenDuringParsing && num == 45)
4571 if ((uint)i >= (uint)
value.Length)
4581 string positiveSign =
info.PositiveSign;
4582 string negativeSign =
info.NegativeSign;
4583 if (!
string.IsNullOrEmpty(positiveSign) &&
value.StartsWith(positiveSign))
4585 i += positiveSign.Length;
4586 if ((uint)i >= (uint)
value.Length)
4592 else if (!
string.IsNullOrEmpty(negativeSign) &&
value.StartsWith(negativeSign))
4595 i += negativeSign.Length;
4596 if ((uint)i >= (uint)
value.Length)
4615 if ((uint)i >= (uint)
value.Length)
4635 if ((uint)i >= (uint)
value.Length)
4643 num2 = 10 * num2 + num - 48;
4649 if ((uint)i >= (uint)
value.Length)
4657 flag = num2 > 922337203685477580
L;
4658 num2 = num2 * 10 + num - 48;
4659 flag = flag || (ulong)num2 > (ulong)(long.MaxValue + (long)(uint)(num3 >>> 31));
4660 if ((uint)i >= (uint)
value.Length)
4669 if ((uint)i < (uint)
value.Length)
4688 if ((uint)i >= (uint)
value.Length)
4721 byte* digits = stackalloc
byte[20];
4751 byte* digits = stackalloc
byte[11];
4779 if ((uint)i >= (uint)
value.Length)
4793 int num2 = num - 48;
4798 if ((uint)i >= (uint)
value.Length)
4806 num2 = 10 * num2 + num - 48;
4812 if ((uint)i >= (uint)
value.Length)
4821 flag = flag || (uint)num2 > 429496729u || (num2 == 429496729 && num > 53);
4822 num2 = num2 * 10 + num - 48;
4823 if ((uint)i >= (uint)
value.Length)
4832 if ((uint)i < (uint)
value.Length)
4842 result = (uint)num2;
4861 if (
info.HasInvariantNumberSigns)
4866 if ((uint)i >= (uint)
value.Length)
4876 if ((uint)i >= (uint)
value.Length)
4883 else if (
info.AllowHyphenDuringParsing && num == 45)
4887 if ((uint)i >= (uint)
value.Length)
4897 string positiveSign =
info.PositiveSign;
4898 string negativeSign =
info.NegativeSign;
4899 if (!
string.IsNullOrEmpty(positiveSign) &&
value.StartsWith(positiveSign))
4901 i += positiveSign.Length;
4902 if ((uint)i >= (uint)
value.Length)
4908 else if (!
string.IsNullOrEmpty(negativeSign) &&
value.StartsWith(negativeSign))
4911 i += negativeSign.Length;
4912 if ((uint)i >= (uint)
value.Length)
4930 if ((uint)i >= (uint)
value.Length)
4954 if ((uint)i >= (uint)
value.Length)
4987 if ((uint)i >= (uint)
value.Length)
5006 if ((uint)i >= (uint)
value.Length)
5015 num2 = 16 * num2 + num4;
5021 if ((uint)i >= (uint)
value.Length)
5031 if ((uint)i >= (uint)
value.Length)
5070 if ((uint)i >= (uint)
value.Length)
5097 if ((uint)i >= (uint)
value.Length)
5135 byte* digits = stackalloc
byte[21];
5163 if ((uint)i >= (uint)
value.Length)
5177 long num2 = num - 48;
5182 if ((uint)i >= (uint)
value.Length)
5190 num2 = 10 * num2 + num - 48;
5196 if ((uint)i >= (uint)
value.Length)
5205 flag = flag || (ulong)num2 > 1844674407370955161uL || (num2 == 1844674407370955161
L && num > 53);
5206 num2 = num2 * 10 + num - 48;
5207 if ((uint)i >= (uint)
value.Length)
5216 if ((uint)i < (uint)
value.Length)
5226 result = (ulong)num2;
5245 if (
info.HasInvariantNumberSigns)
5250 if ((uint)i >= (uint)
value.Length)
5260 if ((uint)i >= (uint)
value.Length)
5267 else if (
info.AllowHyphenDuringParsing && num == 45)
5271 if ((uint)i >= (uint)
value.Length)
5281 string positiveSign =
info.PositiveSign;
5282 string negativeSign =
info.NegativeSign;
5283 if (!
string.IsNullOrEmpty(positiveSign) &&
value.StartsWith(positiveSign))
5285 i += positiveSign.Length;
5286 if ((uint)i >= (uint)
value.Length)
5292 else if (!
string.IsNullOrEmpty(negativeSign) &&
value.StartsWith(negativeSign))
5295 i += negativeSign.Length;
5296 if ((uint)i >= (uint)
value.Length)
5314 if ((uint)i >= (uint)
value.Length)
5338 if ((uint)i >= (uint)
value.Length)
5371 if ((uint)i >= (uint)
value.Length)
5390 if ((uint)i >= (uint)
value.Length)
5399 num2 = 16 * num2 + num4;
5405 if ((uint)i >= (uint)
value.Length)
5415 if ((uint)i >= (uint)
value.Length)
5454 if ((uint)i >= (uint)
value.Length)
5481 if ((uint)i >= (uint)
value.Length)
5506 if (parsingStatus != 0)
5515 byte* ptr = number.GetDigitsPointer();
5516 int num = number.Scale;
5517 bool isNegative = number.IsNegative;
5521 value =
new decimal(0, 0, 0, isNegative, (
byte)
Math.
Clamp(-num, 0, 28));
5535 if (num3 >= 1844674407370955161
L)
5547 if (num3 >= 1844674407370955161
L)
5555 while ((num > 0 || (num2 != 0 && num > -28)) && (num4 < 429496729 || (num4 == 429496729 && (num3 < 11068046444225730969uL || (num3 == 11068046444225730969uL && num2 <= 53)))))
5557 ulong num5 = (ulong)(uint)num3 * 10uL;
5558 ulong num6 = (ulong)((
long)(uint)(num3 >> 32) * 10
L) + (num5 >> 32);
5559 num3 = (uint)num5 + (num6 << 32);
5560 num4 = (uint)(
int)(num6 >> 32) + num4 * 10;
5575 if (num2 == 53 && (num3 & 1) == 0
L)
5578 bool flag = !number.HasNonZeroTail;
5579 while (num2 != 0 && flag)
5581 flag = flag && num2 == 48;
5589 if (++num3 == 0
L && ++num4 == 0)
5591 num3 = 11068046444225730970uL;
5604 value =
new decimal(0, 0, 0, isNegative, 28);
5608 value =
new decimal((
int)num3, (
int)(num3 >> 32), (
int)num4, isNegative, (
byte)(-num));
5642 byte* digits = stackalloc
byte[31];
5644 result =
default(decimal);
5660 return span[0] == c;
5667 byte* digits = stackalloc
byte[769];
5672 if (span.EqualsOrdinalIgnoreCase(
info.PositiveInfinitySymbol))
5674 result =
double.PositiveInfinity;
5676 else if (span.EqualsOrdinalIgnoreCase(
info.NegativeInfinitySymbol))
5678 result =
double.NegativeInfinity;
5680 else if (span.EqualsOrdinalIgnoreCase(
info.NaNSymbol))
5682 result =
double.NaN;
5686 span = span.
Slice(
info.PositiveSign.Length);
5687 if (span.EqualsOrdinalIgnoreCase(
info.PositiveInfinitySymbol))
5689 result =
double.PositiveInfinity;
5693 if (!span.EqualsOrdinalIgnoreCase(
info.NaNSymbol))
5698 result =
double.NaN;
5708 result =
double.NaN;
5720 byte* digits = stackalloc
byte[21];
5725 if (span.EqualsOrdinalIgnoreCase(
info.PositiveInfinitySymbol))
5729 else if (span.EqualsOrdinalIgnoreCase(
info.NegativeInfinitySymbol))
5733 else if (span.EqualsOrdinalIgnoreCase(
info.NaNSymbol))
5739 span = span.
Slice(
info.PositiveSign.Length);
5740 if (!
info.PositiveInfinitySymbol.StartsWith(
info.PositiveSign,
StringComparison.OrdinalIgnoreCase) && span.EqualsOrdinalIgnoreCase(
info.PositiveInfinitySymbol))
5777 byte* digits = stackalloc
byte[114];
5782 if (span.EqualsOrdinalIgnoreCase(
info.PositiveInfinitySymbol))
5784 result =
float.PositiveInfinity;
5786 else if (span.EqualsOrdinalIgnoreCase(
info.NegativeInfinitySymbol))
5788 result =
float.NegativeInfinity;
5790 else if (span.EqualsOrdinalIgnoreCase(
info.NaNSymbol))
5796 span = span.
Slice(
info.PositiveSign.Length);
5797 if (!
info.PositiveInfinitySymbol.StartsWith(
info.PositiveSign,
StringComparison.OrdinalIgnoreCase) && span.EqualsOrdinalIgnoreCase(
info.PositiveInfinitySymbol))
5799 result =
float.PositiveInfinity;
5847 for (
int i =
index; (uint)i < (uint)
value.Length; i++)
5861 return c ==
'\u202f';
5870 if (ptr ==
null &&
info.AllowHyphenDuringParsing && p < pEnd && *p ==
'-')
5879 fixed (
char* ptr =
value)
5886 char c = ((p < pEnd) ? (*p) :
'\0');
5905 if (
ch != 32 && (uint)(
ch - 9) > 4u)
5914 return (uint)(
ch - 48) <= 9u;
5952 if (number.DigitsCount == 0 || number.Scale < -324)
5956 else if (number.Scale > 309)
5958 num =
double.PositiveInfinity;
5965 if (!number.IsNegative)
5975 if (number.DigitsCount == 0 || number.Scale < -8)
5977 half =
default(
Half);
5979 else if (number.Scale > 5)
5988 if (!number.IsNegative)
5998 if (number.DigitsCount == 0 || number.Scale < -45)
6002 else if (number.Scale > 39)
6004 num =
float.PositiveInfinity;
6011 if (!number.IsNegative)
static ushort HalfToUInt16Bits(Half value)
static ulong DoubleToUInt64Bits(double value)
static double UInt64BitsToDouble(ulong value)
static uint SingleToUInt32Bits(float value)
static float UInt32BitsToSingle(uint value)
static unsafe void ZeroMemory(byte *dest, nuint len)
static void Memmove(ref byte dest, ref byte src, nuint len)
static int CountDigits(ulong value)
static int CountHexDigits(ulong value)
static bool IsHexChar(int c)
static int FromChar(int c)
static byte Clamp(byte value, byte min, byte max)
static byte Min(byte val1, byte val2)
static double Ceiling(double a)
static double Abs(double value)
static int DivRem(int a, int b, out int result)
static byte Max(byte val1, byte val2)
static readonly short[] s_CachedPowersBinaryExponent
static bool TryRunSingle(float value, int requestedDigits, ref NumberBuffer number)
static bool TryRunDouble(double value, int requestedDigits, ref NumberBuffer number)
static bool TryDigitGenShortest(in DiyFp low, in DiyFp w, in DiyFp high, Span< byte > buffer, out int length, out int kappa)
static bool TryRunHalf(Half value, int requestedDigits, ref NumberBuffer number)
static DiyFp GetCachedPowerForBinaryExponentRange(int minExponent, int maxExponent, out int decimalExponent)
static bool TryRunShortest(in DiyFp boundaryMinus, in DiyFp w, in DiyFp boundaryPlus, Span< byte > buffer, out int length, out int decimalExponent)
static bool TryRoundWeedShortest(Span< byte > buffer, int length, ulong distanceTooHighW, ulong unsafeInterval, ulong rest, ulong tenKappa, ulong unit)
static bool TryDigitGenCounted(in DiyFp w, int requestedDigits, Span< byte > buffer, out int length, out int kappa)
static readonly uint[] s_SmallPowersOfTen
static bool TryRunCounted(in DiyFp w, int requestedDigits, Span< byte > buffer, out int length, out int decimalExponent)
static readonly short[] s_CachedPowersDecimalExponent
static bool TryRoundWeedCounted(Span< byte > buffer, int length, ulong rest, ulong tenKappa, ulong unit, ref int kappa)
static readonly ulong[] s_CachedPowersSignificand
static uint BiggestPowerTen(uint number, int numberBits, out int exponentPlusOne)
static unsafe string Int32ToHexStr(int value, char hexBase, int digits)
static uint High32(ulong value)
static bool ShouldRoundUp(bool lsbBit, bool roundBit, bool hasTailBits)
static unsafe string UInt64ToDecStr(ulong value, int digits)
static uint Int64DivMod1E9(ref ulong value)
static unsafe void UInt32ToNumber(uint value, ref NumberBuffer number)
static bool TryFormatUInt64(ulong value, ReadOnlySpan< char > format, IFormatProvider provider, Span< char > destination, out int charsWritten)
static unsafe string NegativeInt64ToDecStr(long input, int digits, string sNegative)
static ulong NumberToFloatingPointBitsSlow(ref NumberBuffer number, in FloatingPointInfo info, uint positiveExponent, uint integerDigitsPresent, uint fractionalDigitsPresent)
static unsafe bool TryNumberToUInt32(ref NumberBuffer number, ref uint value)
static unsafe bool TryNumberToInt64(ref NumberBuffer number, ref long value)
static unsafe void Int64ToNumber(long input, ref NumberBuffer number)
static ulong RightShiftWithRounding(ulong value, int shift, bool hasZeroTail)
static unsafe ulong NumberToDoubleFloatingPointBits(ref NumberBuffer number, in FloatingPointInfo info)
static unsafe ulong DigitsToUInt64(byte *p, int count)
static unsafe int FindSection(ReadOnlySpan< char > format, int section)
static string FormatHalf(Half value, string format, NumberFormatInfo info)
static unsafe void FormatExponent(ref ValueStringBuilder sb, NumberFormatInfo info, int value, char expChar, int minDigits, bool positiveSign)
static unsafe uint NumberToSingleFloatingPointBits(ref NumberBuffer number, in FloatingPointInfo info)
static unsafe ParsingStatus TryParseInt32Number(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out int result)
static unsafe void UInt64ToNumber(ulong value, ref NumberBuffer number)
static unsafe void RoundNumber(ref NumberBuffer number, int pos, bool isCorrectlyRounded)
static uint Low32(ulong value)
static unsafe bool TryNumberToUInt64(ref NumberBuffer number, ref ulong value)
static unsafe bool TryInt32ToHexStr(int value, char hexBase, int digits, Span< char > destination, out int charsWritten)
static void FormatCurrency(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo info)
static unsafe bool TryNumberToDecimal(ref NumberBuffer number, ref decimal value)
static readonly string[] s_singleDigitStringCache
static unsafe void FormatGeneral(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo info, char expChar, bool bSuppressScientific)
static bool SpanStartsWith(ReadOnlySpan< char > span, char c)
static unsafe bool TryParseNumber(ref char *str, char *strEnd, NumberStyles styles, ref NumberBuffer number, NumberFormatInfo info)
static void ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type=TypeCode.Empty)
static void FormatNumber(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo info)
static Half NumberToHalf(ref NumberBuffer number)
static unsafe bool TryStringToNumber(ReadOnlySpan< char > value, NumberStyles styles, ref NumberBuffer number, NumberFormatInfo info)
static void ThrowOverflowException(TypeCode type)
static unsafe bool TryUInt32ToDecStr(uint value, int digits, Span< char > destination, out int charsWritten)
static unsafe string FormatDecimal(decimal value, ReadOnlySpan< char > format, NumberFormatInfo info)
static unsafe bool TryParseDouble(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out double result)
static unsafe string NegativeInt32ToDecStr(int value, int digits, string sNegative)
static unsafe void AccumulateDecimalDigitsIntoBigInteger(ref NumberBuffer number, uint firstIndex, uint lastIndex, out BigInteger result)
static unsafe bool TryInt64ToHexStr(long value, char hexBase, int digits, Span< char > destination, out int charsWritten)
static ParsingStatus TryParseUInt32IntegerStyle(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out uint result)
static ParsingStatus TryParseUInt64(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out ulong result)
static readonly string[] s_posPercentFormats
static unsafe bool TryNegativeInt64ToDecStr(long input, int digits, string sNegative, Span< char > destination, out int charsWritten)
static unsafe bool TryFormatDecimal(decimal value, ReadOnlySpan< char > format, NumberFormatInfo info, Span< char > destination, out int charsWritten)
static char ParseFormatSpecifier(ReadOnlySpan< char > format, out int digits)
static unsafe char * MatchChars(char *p, char *pEnd, string value)
static bool TryCopyTo(string source, Span< char > destination, out int charsWritten)
static unsafe bool TryNegativeInt32ToDecStr(int value, int digits, string sNegative, Span< char > destination, out int charsWritten)
static ulong ExtractFractionAndBiasedExponent(double value, out int exponent)
static int ParseInt32(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static unsafe char * Int32ToHexChars(char *buffer, uint value, int hexBase, int digits)
static unsafe void NumberToStringFormat(ref ValueStringBuilder sb, ref NumberBuffer number, ReadOnlySpan< char > format, NumberFormatInfo info)
static bool IsWhite(int ch)
static unsafe void FormatScientific(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo info, char expChar)
static ParsingStatus TryParseInt32IntegerStyle(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out int result)
static unsafe uint Dragon4(ulong mantissa, int exponent, uint mantissaHighBitIdx, bool hasUnequalMargins, int cutoffNumber, bool isSignificantDigits, Span< byte > buffer, out int decimalExponent)
static ushort ExtractFractionAndBiasedExponent(Half value, out int exponent)
static string FormatUInt32(uint value, string format, IFormatProvider provider)
static unsafe string FormatDouble(ref ValueStringBuilder sb, double value, ReadOnlySpan< char > format, NumberFormatInfo info)
static bool IsSpaceReplacingChar(char c)
static unsafe void DecimalToNumber(ref decimal d, ref NumberBuffer number)
static readonly string[] s_negPercentFormats
static ulong AssembleFloatingPointBits(in FloatingPointInfo info, ulong initialMantissa, int initialExponent, bool hasZeroTail)
static unsafe string Int64ToHexStr(long value, char hexBase, int digits)
static bool TryFormatInt64(long value, ReadOnlySpan< char > format, IFormatProvider provider, Span< char > destination, out int charsWritten)
static string FormatInt32(int value, int hexMask, string format, IFormatProvider provider)
static double NumberToDouble(ref NumberBuffer number)
static unsafe ParsingStatus TryParseUInt32Number(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out uint result)
static uint ParseUInt32(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static bool TrailingZeros(ReadOnlySpan< char > value, int index)
static string Int32ToDecStr(int value)
static Half ParseHalf(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static Exception GetException(ParsingStatus status, TypeCode type)
static unsafe bool TryUInt64ToDecStr(ulong value, int digits, Span< char > destination, out int charsWritten)
static unsafe char * MatchNegativeSignChars(char *p, char *pEnd, NumberFormatInfo info)
static unsafe void FormatFixed(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, int[] groupDigits, string sDecimal, string sGroup)
static bool IsDigit(int ch)
static bool TryFormatSingle(float value, ReadOnlySpan< char > format, NumberFormatInfo info, Span< char > destination, out int charsWritten)
static unsafe void Int32ToNumber(int value, ref NumberBuffer number)
static decimal ParseDecimal(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static unsafe ParsingStatus TryParseUInt64Number(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out ulong result)
static uint ExtractFractionAndBiasedExponent(float value, out int exponent)
static unsafe bool TryParseSingle(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out float result)
static float NumberToSingle(ref NumberBuffer number)
static void Dragon4Single(float value, int cutoffNumber, bool isSignificantDigits, ref NumberBuffer number)
static bool TryFormatHalf(Half value, ReadOnlySpan< char > format, NumberFormatInfo info, Span< char > destination, out int charsWritten)
static ParsingStatus TryParseUInt64HexNumberStyle(ReadOnlySpan< char > value, NumberStyles styles, out ulong result)
static void Dragon4Half(Half value, int cutoffNumber, bool isSignificantDigits, ref NumberBuffer number)
static unsafe ushort NumberToHalfFloatingPointBits(ref NumberBuffer number, in FloatingPointInfo info)
static unsafe ParsingStatus TryParseDecimal(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out decimal result)
static char GetHexBase(char fmt)
static bool TryFormatDouble(double value, ReadOnlySpan< char > format, NumberFormatInfo info, Span< char > destination, out int charsWritten)
static double ParseDouble(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static ParsingStatus TryParseUInt64IntegerStyle(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out ulong result)
static bool TryFormatUInt32(uint value, ReadOnlySpan< char > format, IFormatProvider provider, Span< char > destination, out int charsWritten)
static void NumberToString(ref ValueStringBuilder sb, ref NumberBuffer number, char format, int nMaxDigits, NumberFormatInfo info)
static string Int64ToDecStr(long value)
static unsafe bool TryNumberToInt32(ref NumberBuffer number, ref int value)
static readonly string[] s_negNumberFormats
static void Dragon4Double(double value, int cutoffNumber, bool isSignificantDigits, ref NumberBuffer number)
static ulong ParseUInt64(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static long ParseInt64(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static float ParseSingle(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info)
static readonly double[] s_Pow10DoubleTable
static unsafe byte * UInt32ToDecChars(byte *bufferEnd, uint value, int digits)
static int GetFloatingPointMaxDigitsAndPrecision(char fmt, ref int precision, NumberFormatInfo info, out bool isSignificantDigits)
static ulong ConvertBigIntegerToFloatingPointBits(ref BigInteger value, in FloatingPointInfo info, uint integerBitsOfPrecision, bool hasNonZeroFractionalPart)
static unsafe string FormatSingle(ref ValueStringBuilder sb, float value, ReadOnlySpan< char > format, NumberFormatInfo info)
static ParsingStatus TryParseInt64IntegerStyle(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out long result)
static ParsingStatus TryParseInt32(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out int result)
static readonly string[] s_posCurrencyFormats
static unsafe char * UInt32ToDecChars(char *bufferEnd, uint value, int digits)
static string FormatSingle(float value, string format, NumberFormatInfo info)
static unsafe string UInt32ToDecStr(uint value, int digits)
static unsafe uint DigitsToUInt32(byte *p, int count)
static void FormatPercent(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo info)
static bool TryFormatInt32(int value, int hexMask, ReadOnlySpan< char > format, IFormatProvider provider, Span< char > destination, out int charsWritten)
static ParsingStatus TryParseUInt32(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out uint result)
static readonly float[] s_Pow10SingleTable
static ParsingStatus TryParseInt64(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out long result)
static unsafe string UInt32ToDecStr(uint value)
static unsafe string FormatHalf(ref ValueStringBuilder sb, Half value, ReadOnlySpan< char > format, NumberFormatInfo info)
static string FormatDouble(double value, string format, NumberFormatInfo info)
static readonly string[] s_negCurrencyFormats
static string FormatUInt64(ulong value, string format, IFormatProvider provider)
static string FormatInt64(long value, string format, IFormatProvider provider)
static unsafe ParsingStatus TryParseInt64Number(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out long result)
static unsafe bool TryParseHalf(ReadOnlySpan< char > value, NumberStyles styles, NumberFormatInfo info, out Half result)
static ParsingStatus TryParseUInt32HexNumberStyle(ReadOnlySpan< char > value, NumberStyles styles, out uint result)
static int Log2(uint value)
static int LeadingZeroCount(uint value)
static string Overflow_Int16
static string Overflow_UInt16
static string Overflow_Int32
static string Overflow_SByte
static string Overflow_UInt64
static string Argument_BadFormatSpecifier
static string Overflow_Int64
static string Overflow_Byte
static string Format_InvalidString
static string Overflow_Decimal
static string Overflow_UInt32
override string ToString()
StringBuilder Append(char value, int repeatCount)
static Half NegativeInfinity
static bool IsNaN(Half value)
static Half Negate(Half value)
static bool IsNegative(Half value)
static Half PositiveInfinity
static bool IsFinite(Half value)
static bool DivideGuessTooBig(ulong q, ulong valHi, uint valLo, uint divHi, uint divLo)
static void SetZero(out BigInteger result)
static unsafe void Pow10(uint exponent, out BigInteger result)
static readonly int[] s_Pow10BigNumTableIndices
static unsafe void SetUInt64(out BigInteger result, ulong value)
static unsafe void Multiply(ref BigInteger lhs, ref BigInteger rhs, out BigInteger result)
void MultiplyPow10(uint exponent)
static unsafe void Add(ref BigInteger lhs, ref BigInteger rhs, out BigInteger result)
unsafe void Add(uint value)
static unsafe void DivRem(ref BigInteger lhs, ref BigInteger rhs, out BigInteger quo, out BigInteger rem)
static uint DivRem32(uint value, out uint remainder)
static unsafe void Pow2(uint exponent, out BigInteger result)
void Multiply(uint value)
static unsafe uint SubtractDivisor(ref BigInteger lhs, int lhsStartIndex, ref BigInteger rhs, ulong q)
static unsafe void SetValue(out BigInteger result, ref BigInteger value)
static unsafe uint AddDivisor(ref BigInteger lhs, int lhsStartIndex, ref BigInteger rhs)
unsafe fixed uint _blocks[115]
static readonly uint[] s_Pow10UInt32Table
unsafe void Clear(uint length)
static unsafe uint CountSignificantBits(ref BigInteger value)
static unsafe int Compare(ref BigInteger lhs, ref BigInteger rhs)
unsafe void ShiftLeft(uint shift)
static uint CountSignificantBits(ulong value)
unsafe uint GetBlock(uint index)
static unsafe void SetUInt32(out BigInteger result, uint value)
static uint CountSignificantBits(uint value)
static unsafe uint HeuristicDivide(ref BigInteger dividend, ref BigInteger divisor)
static readonly uint[] s_Pow10BigNumTable
static unsafe void Multiply(ref BigInteger lhs, uint value, out BigInteger result)
void Multiply(ref BigInteger value)
void GetBoundaries(int implicitBitIndex, out DiyFp mMinus, out DiyFp mPlus)
static DiyFp CreateAndGetBoundaries(Half value, out DiyFp mMinus, out DiyFp mPlus)
static DiyFp CreateAndGetBoundaries(float value, out DiyFp mMinus, out DiyFp mPlus)
DiyFp Multiply(in DiyFp other)
static DiyFp CreateAndGetBoundaries(double value, out DiyFp mMinus, out DiyFp mPlus)
DiyFp Subtract(in DiyFp other)
static readonly FloatingPointInfo Half
FloatingPointInfo(ushort denormalMantissaBits, ushort exponentBits, int maxBinaryExponent, int exponentBias, ulong infinityBits)
int OverflowDecimalExponent
static readonly FloatingPointInfo Double
static readonly FloatingPointInfo Single
ulong DenormalMantissaMask
ushort DenormalMantissaBits
readonly ushort _003CExponentBits_003Ek__BackingField
ushort NormalMantissaBits
unsafe byte * GetDigitsPointer()
unsafe NumberBuffer(NumberBufferKind kind, byte *digits, int digitsLength)
override string ToString()
ReadOnlySpan< T > Slice(int start)
void CopyTo(Span< T > destination)
override string ToString()
bool TryCopyTo(Span< char > destination, out int charsWritten)