【问题标题】:Square root of negative numbers负数的平方根
【发布时间】:2013-09-20 18:14:22
【问题描述】:

只是想知道,是否可以在 C# 中计算负数的平方根? 例如 sqrt(-1) = i.

我写了这段代码:

using System;

public static class sqrts
{
    public static void Main()
    {
        string x;
        double sqrtofx;

        Console.Write("Enter a number: ");
        x = Console.ReadLine();

        sqrtofx = Math.Sqrt(Convert.ToInt32(x));

        Console.WriteLine("\nSqrt({0}): {1}", x, sqrtofx);

        Console.ReadKey();
    }
}

如果我输入 25,它会给出 5。但是,如果我输入 -5,它会给出 NaN 而不是 5i。

【问题讨论】:

    标签: c# square-root


    【解决方案1】:

    有一个 Complex 结构可以满足您的需求:

    Complex c = Complex.Sqrt(-25); // has a value of approximately 0 + 5i
    

    (从大多数数字类型,包括int,到Complex,都有一个隐式转换。它的工作方式与您可能期望的一样:数字被视为实部,虚部为0。这是-25 如何成为Complex.Sqrt(Complex) 的有效参数。)

    【讨论】:

    • Complex.Sqrt() 只接受 Complex 对象。不确定从否定 int 进行类型转换是否有效。
    • @dognose 是的,有一个隐式转换。
    • “somemessynumbers”是因为计算有点不精确,所以它会找到一个接近 0 的值,而不是 0 的实数部分。您可以选择以隐藏它的方式输出数字,例如.ToString("0.###")。而(0, 5) 格式正是Complex 的默认ToString() 的工作方式。您可以编写自己的方法将其转换为漂亮的数字,例如5i
    【解决方案2】:

    使用C#实现的复杂结构:http://msdn.microsoft.com/en-us/library/system.numerics.complex.aspx

    Complex c = new Complex(-1,0);
    Complex result = Complex.Sqrt(c);
    

    http://msdn.microsoft.com/en-us/library/system.numerics.complex.sqrt.aspx

    【讨论】:

      【解决方案3】:

      double(或intlongshort 或任何其他内置数字类型)不是为支持非实数而构建的。现有的库 构建为支持任何复数,但作为附加功能的交换,它们消耗更多空间并且对它们的操作要慢得多。由于很多领域都需要计算实数,因此将这些成本添加到这些最基本的数字类型是不合理的。

      【讨论】:

        【解决方案4】:

        这是因为负数的平方根产生复数。在更基础和一般的数学中,假设平方根仅适用于正数。要么取你的数字的绝对值的平方根,要么使用Complex 数据类型和它的平方根函数。您的决定取决于您的目标。

        【讨论】:

          【解决方案5】:

          或者你可以这样做

          public static float Root(float value)
          {
              int negative = 1;
              if(value < 0)
                  negative = -1;
              return Math.Sqrt(Math.Abs(value)) * negative;
          }
          

          那么您可以在每次需要root时使用此功能而不必担心

          这应该比 Complex 轻得多,并且您可以很好地控制它。

          【讨论】:

            【解决方案6】:

            为什么不先检查是否为负,如果是,则乘以 (-1) 并将i 添加到输出中?

            【讨论】:

            • 哦,如果你想这样,你需要使用Complex数据类型
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-11
            • 1970-01-01
            • 1970-01-01
            • 2015-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多