Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ ScaleResult()

static unsafe int System.Decimal.DecCalc.ScaleResult ( Buf24 * bufRes,
uint hiRes,
int scale )
inlinestaticprivate

Definition at line 513 of file Decimal.cs.

514 {
515 int num = 0;
516 if (hiRes > 2)
517 {
518 num = (int)(hiRes * 32 - 64 - 1);
519 num -= BitOperations.LeadingZeroCount(*(uint*)((byte*)bufRes + (long)hiRes * 4L));
520 num = (num * 77 >> 8) + 1;
521 if (num > scale)
522 {
523 goto IL_01cc;
524 }
525 }
526 if (num < scale - 28)
527 {
528 num = scale - 28;
529 }
530 if (num == 0)
531 {
532 goto IL_01ca;
533 }
534 scale -= num;
535 uint num2 = 0u;
536 uint remainder = 0u;
537 while (true)
538 {
539 num2 |= remainder;
540 uint num3 = num switch
541 {
542 1 => DivByConst((uint*)bufRes, hiRes, out var quotient, out remainder, 10u),
543 2 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 100u),
544 3 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 1000u),
545 4 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 10000u),
546 5 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 100000u),
547 6 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 1000000u),
548 7 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 10000000u),
549 8 => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 100000000u),
550 _ => DivByConst((uint*)bufRes, hiRes, out quotient, out remainder, 1000000000u),
551 };
552 *(uint*)((byte*)bufRes + (long)hiRes * 4L) = quotient;
553 if (quotient == 0 && hiRes != 0)
554 {
555 hiRes--;
556 }
557 num -= 9;
558 if (num > 0)
559 {
560 continue;
561 }
562 if (hiRes > 2)
563 {
564 if (scale == 0)
565 {
566 break;
567 }
568 num = 1;
569 scale--;
570 continue;
571 }
572 num3 >>= 1;
573 if (num3 <= remainder && (num3 < remainder || ((*(uint*)bufRes & (true ? 1u : 0u)) | num2) != 0) && ++(*(int*)bufRes) == 0)
574 {
575 uint num4 = 0u;
576 while (++(*(int*)((byte*)bufRes + (long)(++num4) * 4L)) == 0)
577 {
578 }
579 if (num4 > 2)
580 {
581 if (scale == 0)
582 {
583 break;
584 }
585 hiRes = num4;
586 num2 = 0u;
587 remainder = 0u;
588 num = 1;
589 scale--;
590 continue;
591 }
592 }
593 goto IL_01ca;
594 }
595 goto IL_01cc;
596 IL_01cc:
597 Number.ThrowOverflowException(TypeCode.Decimal);
598 return 0;
599 IL_01ca:
600 return scale;
601 }
static int LeadingZeroCount(uint value)
static unsafe uint DivByConst(uint *result, uint hiRes, out uint quotient, out uint remainder, uint power)
Definition Decimal.cs:604

References System.Runtime.Serialization.Dictionary, System.Decimal.DecCalc.DivByConst(), System.L, System.Numerics.BitOperations.LeadingZeroCount(), and System.Number.ThrowOverflowException().

Referenced by System.Decimal.DecCalc.DecAddSub(), and System.Decimal.DecCalc.VarDecMul().