567 {
568 if (
value.m_imaginary == 0.0)
569 {
570 if (
value.m_real < 0.0)
571 {
573 }
575 }
576 bool flag = false;
577 double num =
value.m_real;
578 double num2 =
value.m_imaginary;
580 {
582 {
583 return new Complex(
double.PositiveInfinity, num2);
584 }
585 num *= 0.25;
586 num2 *= 0.25;
587 flag = true;
588 }
589 double num3;
590 double num4;
591 if (num >= 0.0)
592 {
593 num3 = Math.Sqrt((
Hypot(num, num2) + num) * 0.5);
594 num4 = num2 / (2.0 * num3);
595 }
596 else
597 {
598 num4 = Math.Sqrt((
Hypot(num, num2) - num) * 0.5);
599 if (num2 < 0.0)
600 {
601 num4 = 0.0 - num4;
602 }
603 num3 = num2 / (2.0 * num4);
604 }
605 if (flag)
606 {
607 num3 *= 2.0;
608 num4 *= 2.0;
609 }
610 return new Complex(num3, num4);
611 }
static readonly double s_sqrtRescaleThreshold
Complex(double real, double imaginary)
static bool IsInfinity(Complex value)
static double Hypot(double a, double b)