负数的平方根

本文关键字:平方根 | 更新日期: 2023-09-27 18:32:14

只是想知道,是否可以在 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。

负数的平方根

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

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

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

使用实现的 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

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

这是因为负数的平方根会产生复数。在更基本和一般的数学中,平方根被认为仅适用于正数。要么取数字绝对值的平方根,要么使用 Complex 数据类型及其平方根函数。你决定什么取决于你的目标是实现什么。

或者你可以简单地这样做

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

然后,每次需要root时都可以使用此功能而不必担心

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

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