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

◆ DblToRgbFast()

static bool System.Xml.Xsl.XPathConvert.BigNumber.DblToRgbFast ( double dbl,
byte[] mantissa,
out int exponent,
out int mantissaSize )
inlinestatic

Definition at line 489 of file XPathConvert.cs.

490 {
491 int num = 0;
492 uint num2 = DblHi(dbl);
493 uint num3 = DblLo(dbl);
494 int num4 = (int)((num2 >> 20) & 0x7FF);
495 Unsafe.SkipInit(out BigNumber bigNumber);
498 int num7;
499 if (num4 > 0)
500 {
501 if (num4 >= 1023 && num4 <= 1075 && dbl == Math.Floor(dbl))
502 {
503 double num5 = dbl;
504 int num6 = 0;
505 if (num5 >= C10toN[num6 + 8])
506 {
507 num6 += 8;
508 }
509 if (num5 >= C10toN[num6 + 4])
510 {
511 num6 += 4;
512 }
513 if (num5 >= C10toN[num6 + 2])
514 {
515 num6 += 2;
516 }
517 if (num5 >= C10toN[num6 + 1])
518 {
519 num6++;
520 }
521 exponent = num6 + 1;
522 num7 = 0;
523 while (0.0 != num5)
524 {
525 byte b = (byte)(num5 / C10toN[num6]);
526 num5 -= (double)(int)b * C10toN[num6];
527 mantissa[num7++] = b;
528 num6--;
529 }
531 goto IL_05a9;
532 }
533 bigNumber._u2 = 0x80000000u | ((num2 & 0xFFFFFF) << 11) | (num3 >> 21);
534 bigNumber._u1 = num3 << 11;
535 bigNumber._u0 = 0u;
536 bigNumber._exp = num4 - 1022;
539 bigNumber2._u1 |= 1024u;
541 if (AddU(u2: (int.MinValue != (int)bigNumber3._u2 || bigNumber3._u1 != 0) ? 4294966272u : 4294966784u, u1: ref bigNumber3._u1) == 0)
542 {
543 AddU(ref bigNumber3._u2, uint.MaxValue);
544 if ((0x80000000u & bigNumber3._u2) == 0)
545 {
546 bigNumber3.Normalize();
547 }
548 }
549 }
550 else
551 {
552 bigNumber._u2 = num2 & 0xFFFFFu;
554 bigNumber._u0 = 0u;
555 bigNumber._exp = -1010;
558 bigNumber2._u0 = 2147483648u;
560 if (AddU(ref bigNumber3._u1, uint.MaxValue) == 0)
561 {
562 AddU(ref bigNumber3._u2, uint.MaxValue);
563 }
564 bigNumber.Normalize();
565 bigNumber2.Normalize();
566 bigNumber3.Normalize();
567 }
568 if (bigNumber2._exp >= 32)
569 {
570 int num6 = (bigNumber2._exp - 25) * 15 / -s_tenPowersNeg[45]._exp;
571 if (num6 > 0)
572 {
574 bigNumber2.Mul(ref numOp);
575 bigNumber3.Mul(ref numOp);
576 num += num6 * 32;
577 }
578 if (bigNumber2._exp >= 32)
579 {
580 num6 = (bigNumber2._exp - 25) * 32 / -s_tenPowersNeg[31]._exp;
582 bigNumber2.Mul(ref numOp);
583 bigNumber3.Mul(ref numOp);
584 num += num6;
585 }
586 }
587 else if (bigNumber2._exp < 1)
588 {
589 int num6 = (25 - bigNumber2._exp) * 15 / s_tenPowersPos[45]._exp;
590 if (num6 > 0)
591 {
593 bigNumber2.Mul(ref numOp);
594 bigNumber3.Mul(ref numOp);
595 num -= num6 * 32;
596 }
597 if (bigNumber2._exp < 1)
598 {
599 num6 = (25 - bigNumber2._exp) * 32 / s_tenPowersPos[31]._exp;
601 bigNumber2.Mul(ref numOp);
602 bigNumber3.Mul(ref numOp);
603 num -= num6;
604 }
605 }
607 bigNumber2.MakeUpperBound();
608 bigNumber4.MakeLowerBound();
609 uint num8 = bigNumber2.UMod1();
610 uint num9 = bigNumber4.UMod1();
612 bigNumber5.MakeUpperBound();
613 bigNumber3.MakeLowerBound();
614 uint num10 = bigNumber5.UMod1();
615 uint num11 = bigNumber3.UMod1();
616 uint num12 = 1u;
617 if (num8 >= 100000000)
618 {
619 num12 = 100000000u;
620 num += 8;
621 }
622 else
623 {
624 if (num8 >= 10000)
625 {
626 num12 = 10000u;
627 num += 4;
628 }
629 if (num8 >= 100 * num12)
630 {
631 num12 *= 100;
632 num += 2;
633 }
634 }
635 if (num8 >= 10 * num12)
636 {
637 num12 *= 10;
638 num++;
639 }
640 num++;
641 num7 = 0;
642 while (true)
643 {
644 byte b = (byte)(num8 / num12);
645 num8 %= num12;
646 byte b2 = (byte)(num11 / num12);
647 num11 %= num12;
648 if (b == b2)
649 {
650 mantissa[num7++] = b;
651 if (1 != num12)
652 {
653 num12 /= 10;
654 continue;
655 }
656 num12 = 10000000u;
658 bigNumber2.MakeUpperBound();
659 num8 = bigNumber2.UMod1();
660 if (num8 < 100000000)
661 {
663 bigNumber4.MakeLowerBound();
664 num9 = bigNumber4.UMod1();
666 bigNumber5.MakeUpperBound();
667 num10 = bigNumber5.UMod1();
669 bigNumber3.MakeLowerBound();
670 num11 = bigNumber3.UMod1();
671 continue;
672 }
673 }
674 else
675 {
676 byte b3 = (byte)(num10 / num12 % 10);
677 num10 %= num12;
678 byte b4 = (byte)(num9 / num12 % 10);
679 num9 %= num12;
680 if (b3 < b4)
681 {
682 if (b3 == 0 && num10 == 0 && bigNumber5.IsZero && (num3 & 1) == 0)
683 {
684 break;
685 }
686 if (b4 - b3 > 1)
687 {
688 mantissa[num7++] = (byte)((b4 + b3 + 1) / 2);
689 break;
690 }
691 if (num9 != 0 || !bigNumber4.IsZero || (num3 & 1) == 0)
692 {
693 mantissa[num7++] = b4;
694 break;
695 }
696 }
697 }
698 exponent = (mantissaSize = 0);
699 return false;
700 }
701 exponent = num;
703 goto IL_05a9;
704 IL_05a9:
705 return true;
706 }
static readonly double[] C10toN
static uint AddU(ref uint u1, uint u2)
static uint DblLo(double dbl)
static uint DblHi(double dbl)
BigNumber(uint u0, uint u1, uint u2, int exp, uint error)
static readonly BigNumber[] s_tenPowersNeg
static readonly BigNumber[] s_tenPowersPos

References System.Xml.Xsl.XPathConvert.BigNumber._exp, System.Xml.Xsl.XPathConvert.AddU(), System.Xml.Xsl.XPathConvert.C10toN, System.Xml.Xsl.XPathConvert.DblHi(), System.Xml.Xsl.XPathConvert.DblLo(), System.Xml.Dictionary, System.Math.Floor(), System.Xml.Xsl.XPathConvert.BigNumber.MakeUpperBound(), System.Xml.Xsl.XPathConvert.BigNumber.s_tenPowersNeg, and System.Xml.Xsl.XPathConvert.BigNumber.s_tenPowersPos.

Referenced by System.Xml.Xsl.XPathConvert.FloatingDecimal.InitFromDouble().