Aracılığıyla paylaş


System.Numerics.Complex yapısı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Karmaşık sayı, gerçek sayı bölümünü ve sanal sayı bölümünü içeren bir sayıdır. Karmaşık bir z sayısı genellikle biçiminde z = x + yiyazılır; burada x ve y gerçek sayılardır ve i, i2 = -1 özelliğine sahip sanal birimdir. Karmaşık sayının gerçek kısmı x, karmaşık sayının sanal kısmı ise y ile temsil edilir.

Türü, Complex karmaşık sayıların örneğini oluştururken ve düzenlerken Kartezyen koordinat sistemini (gerçek, sanal) kullanır. Karmaşık bir sayı, karmaşık düzlem olarak bilinen iki boyutlu koordinat sisteminde bir nokta olarak temsil edilebilir. Karmaşık sayının gerçek kısmı x eksenine (yatay eksen) ve sanal bölüm y eksenine (dikey eksen) konumlandırılır.

Karmaşık düzlemdeki herhangi bir nokta, kutup koordinat sistemi kullanılarak mutlak değerine göre de ifade edilebilir. Kutupsal koordinatlarda bir nokta iki sayı ile karakterize edilir:

  • Noktanın çıkış noktasından uzaklığı olan büyüklüğü (0,0 veya x ekseni ile y ekseninin kesiştiği nokta).
  • Gerçek eksen ile çıkış noktasından noktaya doğru çekilen çizgi arasındaki açı olan fazı.

Karmaşık bir sayı örneği oluşturma

Karmaşık bir sayıya aşağıdaki yollardan biriyle değer atayabilirsiniz:

  • Oluşturucusna iki Double değer geçirerek. İlk değer karmaşık sayının gerçek kısmını, ikinci değer ise sanal kısmını temsil eder. Bu değerler, iki boyutlu Kartezyen koordinat sistemindeki karmaşık sayının konumunu temsil eder.

  • Statik (Shared Visual Basic'te) Complex.FromPolarCoordinates yöntemini çağırarak kutupsal koordinatlarından karmaşık bir sayı oluşturun.

  • Bir Bytenesneye , SByte, Int16, UInt16, , Int32, UInt32, Int64, UInt64, Singleveya Double değeri Complex atayarak. Değer, karmaşık sayının gerçek parçası olur ve sanal kısmı 0'a eşittir.

  • Bir veya değerini Complex nesneye dönüştürerek (C# dilinde) Decimal BigInteger veya dönüştürerek (Visual Basic'te). Değer, karmaşık sayının gerçek parçası olur ve sanal kısmı 0'a eşittir.

  • Bir yöntem veya işleç tarafından döndürülen karmaşık sayıyı bir Complex nesneye atayarak. Örneğin, Complex.Add iki karmaşık sayının toplamı olan karmaşık bir sayı döndüren ve Complex.Addition işleç iki karmaşık sayı ekleyip sonucu döndüren statik bir yöntemdir.

Aşağıdaki örnekte, karmaşık bir sayıya değer atamanın bu beş yolunun her biri gösterilmektedir.

using System;
using System.Numerics;

public class CreateEx
{
    public static void Main()
    {
        // Create a complex number by calling its class constructor.
        Complex c1 = new Complex(12, 6);
        Console.WriteLine(c1);

        // Assign a Double to a complex number.
        Complex c2 = 3.14;
        Console.WriteLine(c2);

        // Cast a Decimal to a complex number.
        Complex c3 = (Complex)12.3m;
        Console.WriteLine(c3);

        // Assign the return value of a method to a Complex variable.
        Complex c4 = Complex.Pow(Complex.One, -1);
        Console.WriteLine(c4);

        // Assign the value returned by an operator to a Complex variable.
        Complex c5 = Complex.One + Complex.One;
        Console.WriteLine(c5);

        // Instantiate a complex number from its polar coordinates.
        Complex c6 = Complex.FromPolarCoordinates(10, .524);
        Console.WriteLine(c6);
    }
}
// The example displays the following output:
//       (12, 6)
//       (3.14, 0)
//       (12.3, 0)
//       (1, 0)
//       (2, 0)
//       (8.65824721882145, 5.00347430269914)
Imports System.Numerics

Module Example
   Public Sub Main()
      ' Create a complex number by calling its class constructor.
      Dim c1 As New Complex(12, 6)
      Console.WriteLine(c1)
      
      ' Assign a Double to a complex number.
      Dim c2 As Complex = 3.14
      Console.WriteLine(c2)
      
      ' Cast a Decimal to a complex number.
      Dim c3 As Complex = CType(12.3d, Complex)
      Console.WriteLine(c3)
      
      ' Assign the return value of a method to a Complex variable.
      Dim c4 As Complex = Complex.Pow(Complex.One, -1)
      Console.WriteLine(c4)
      
      ' Assign the value returned by an operator to a Complex variable.
      Dim c5 As Complex = Complex.One + Complex.One
      Console.WriteLine(c5)

      ' Instantiate a complex number from its polar coordinates.
      Dim c6 As Complex = Complex.FromPolarCoordinates(10, .524)
      Console.WriteLine(c6)
   End Sub
End Module
' The example displays the following output:
'       (12, 6)
'       (3.14, 0)
'       (12.3000001907349, 0)
'       (1, 0)
'       (2, 0)
'       (8.65824721882145, 5.00347430269914)

Karmaşık sayılarla işlemler

Complex.NET'teki yapı, aşağıdaki işlevleri sağlayan üyeleri içerir:

  • Eşit olup olmadıklarını belirlemek için iki karmaşık sayıyı karşılaştırma yöntemleri.
  • Karmaşık sayılarda aritmetik işlemler gerçekleştirmek için işleçler. Complex işleçleri karmaşık sayılarla toplama, çıkarma, çarpma, bölme ve tekli olumsuzlama gerçekleştirmenizi sağlar.
  • Karmaşık sayılarda diğer sayısal işlemleri gerçekleştirme yöntemleri. Dört temel aritmetik işlemine ek olarak, karmaşık bir sayıyı belirtilen bir güce yükseltebilir, karmaşık bir sayının karekökünü bulabilir ve karmaşık bir sayının mutlak değerini alabilirsiniz.
  • Karmaşık sayılarda trigonometrik işlemler gerçekleştirme yöntemleri. Örneğin, karmaşık bir sayının temsil ettiği açının tanjantını hesaplayabilirsiniz.

ve Imaginary özellikleri salt okunur olduğundanReal, var olan Complex bir nesnenin değerini değiştiremeyeceğinizi unutmayın. Bir sayı üzerinde Complex işlem gerçekleştiren tüm yöntemler, dönüş değerleri türündeyse Complexyeni Complex bir sayı döndürür.

Duyarlık ve karmaşık sayılar

Karmaşık bir sayının gerçek ve sanal bölümleri iki çift duyarlıklı kayan nokta değeriyle temsil edilir. Bu, çift duyarlıklı kayan Complex nokta değerleri gibi değerlerin sayısal işlemler sonucunda duyarlığı kaybedebileceği anlamına gelir. Bu, iki değer arasındaki fark duyarlık kaybından kaynaklanıyor olsa bile iki Complex değerin eşitliği için katı karşılaştırmaların başarısız olabileceği anlamına gelir. Daha fazla bilgi için bkz. Double.

Örneğin, bir sayının logaritmasında üstelleştirme gerçekleştirmek özgün sayıyı döndürmelidir. Ancak, bazı durumlarda kayan nokta değerlerinin duyarlık kaybı, aşağıdaki örnekte gösterildiği gibi iki değer arasında küçük farklılıklara neden olabilir.

Complex value = new Complex(Double.MinValue / 2, Double.MinValue / 2);
Complex value2 = Complex.Exp(Complex.Log(value));
Console.WriteLine("{0} \n{1} \nEqual: {2}", value, value2,
                                            value == value2);
// The example displays the following output:
//    (-8.98846567431158E+307, -8.98846567431158E+307)
//    (-8.98846567431161E+307, -8.98846567431161E+307)
//    Equal: False
Dim value As New Complex(Double.MinValue / 2, Double.MinValue / 2)
Dim value2 As Complex = Complex.Exp(Complex.Log(value))
Console.WriteLine("{0} {3}{1} {3}Equal: {2}", value, value2,
                                              value = value2,
                                              vbCrLf)
' The example displays the following output:
'    (-8.98846567431158E+307, -8.98846567431158E+307)
'    (-8.98846567431161E+307, -8.98846567431161E+307)
'    Equal: False

Benzer şekilde, bir Complex sayının karekökünü hesaplayan aşağıdaki örnek, .NET'in 32 bit ve IA64 sürümlerinde biraz farklı sonuçlar üretir.

Complex minusOne = new Complex(-1, 0);
Console.WriteLine(Complex.Sqrt(minusOne));
// The example displays the following output:
//    (6.12303176911189E-17, 1) on 32-bit systems.
//    (6.12323399573677E-17,1) on IA64 systems.
Dim minusOne As New Complex(-1, 0)
Console.WriteLine(Complex.Sqrt(minusOne))
' The example displays the following output:
'    (6.12303176911189E-17, 1) on 32-bit systems.
'    (6.12323399573677E-17,1) on IA64 systems.

Sonsuzluk ve NaN

Karmaşık bir sayının gerçek ve sanal bölümleri değerlerle Double temsil edilir. ile arasında değişenlere Double.MinValue Double.MaxValueek olarak, karmaşık bir sayının gerçek veya sanal kısmı , Double.NegativeInfinityveya Double.NaNdeğerine Double.PositiveInfinitysahip olabilir. Double.PositiveInfinity, Double.NegativeInfinityve Double.NaN tümü herhangi bir aritmetik veya trigonometrik işlemde yayılır.

Aşağıdaki örnekte, bölme ölçütü Zero gerçek ve sanal parçaları her ikisi de Double.NaNolan karmaşık bir sayı üretir. Sonuç olarak, bu değerle çarpma gerçekleştirmek, gerçek ve sanal parçaları Double.NaNolan karmaşık bir sayı da üretir. Benzer şekilde, türün aralığını Double aşan bir çarpma gerçekleştirmek, gerçek bölümü olan ve hayali bölümü Double.NaN Double.PositiveInfinityolan karmaşık bir sayı üretir. Daha sonra bu karmaşık sayı ile bölme işlemi gerçek bölümü ve hayali bölümü Double.NaN Double.PositiveInfinityolan karmaşık bir sayı döndürür.

using System;
using System.Numerics;

public class NaNEx
{
    public static void Main()
    {
        Complex c1 = new Complex(Double.MaxValue / 2, Double.MaxValue / 2);

        Complex c2 = c1 / Complex.Zero;
        Console.WriteLine(c2.ToString());
        c2 = c2 * new Complex(1.5, 1.5);
        Console.WriteLine(c2.ToString());
        Console.WriteLine();

        Complex c3 = c1 * new Complex(2.5, 3.5);
        Console.WriteLine(c3.ToString());
        c3 = c3 + new Complex(Double.MinValue / 2, Double.MaxValue / 2);
        Console.WriteLine(c3);
    }
}
// The example displays the following output:
//       (NaN, NaN)
//       (NaN, NaN)
//       (NaN, Infinity)
//       (NaN, Infinity)
Imports System.Numerics

Module Example4
    Public Sub Main()
        Dim c1 As Complex = New Complex(Double.MaxValue / 2, Double.MaxValue / 2)

        Dim c2 As Complex = c1 / Complex.Zero
        Console.WriteLine(c2.ToString())
        c2 = c2 * New Complex(1.5, 1.5)
        Console.WriteLine(c2.ToString())
        Console.WriteLine()

        Dim c3 As Complex = c1 * New Complex(2.5, 3.5)
        Console.WriteLine(c3.ToString())
        c3 = c3 + New Complex(Double.MinValue / 2, Double.MaxValue / 2)
        Console.WriteLine(c3)
    End Sub
End Module
' The example displays the following output:
'       (NaN, NaN)
'       (NaN, NaN)
'
'       (NaN, Infinity)
'       (NaN, Infinity)

Geçersiz olan veya veri türü aralığını Double aşan karmaşık sayılarla matematik işlemleri özel durum oluşturmaz. Bunun yerine, aşağıdaki koşullar altında bir Double.PositiveInfinity, Double.NegativeInfinityveya Double.NaN döndürürler:

Bunun bir yöntem tarafından gerçekleştirilen ara hesaplamalar için geçerli olduğunu unutmayın. Örneğin, çarpımı new Complex(9e308, 9e308) and new Complex(2.5, 3.5) formülü (ac - bd) + (ad + bc)i formülünü kullanır. Çarpma sonucu elde eden gerçek bileşenin hesaplanması, 9e308 2.5 - 9e308 3.5 ifadesini değerlendirir. Bu ifadedeki her ara çarpma döndürür Double.PositiveInfinityve çıkarma girişimi Double.PositiveInfinity Double.PositiveInfinity döndürür Double.NaN.

Karmaşık bir sayıyı biçimlendirme

Varsayılan olarak, karmaşık bir sayının dize gösterimi gerçek ,)sanal biçimi (alır; burada gerçek ve sanal, karmaşık sayının gerçek ve sanal bileşenlerini oluşturan değerlerin dize gösterimleridir.Double yönteminin ToString bazı aşırı yüklemeleri, belirli bir kültürün biçimlendirme kurallarını yansıtmak veya standart veya özel bir sayısal biçim dizesi tarafından tanımlanan belirli bir biçimde görünmesi için bu Double değerlerin dize gösterimlerinin özelleştirilmesine olanak tanır. (Daha fazla bilgi için bkz. Standart Sayısal Biçim Dizeleri ve Özel Sayısal Biçim Dizeleri.)

Karmaşık bir sayının dize gösterimini ifade etmenin daha yaygın yollarından biri, karmaşık sayının gerçek bileşeni olan + bi biçimini alır ve b karmaşık sayının sanal bileşenidir. Elektrik mühendisliğinde karmaşık bir sayı en yaygın olarak + bj olarak ifade edilir. Bu iki biçimden birinde karmaşık bir sayının dize gösterimini döndürebilirsiniz. Bunu yapmak için ve arabirimlerini uygulayarak ICustomFormatter özel bir biçim sağlayıcısı tanımlayın ve yöntemini çağırınString.Format(IFormatProvider, String, Object[]).IFormatProvider

Aşağıdaki örnek, karmaşık bir ComplexFormatter sayıyı bir + bi veya + bj biçiminde bir dize olarak temsil eden bir sınıfı tanımlar.

using System;
using System.Numerics;

public class ComplexFormatter : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    }

    public string Format(string format, object arg,
                         IFormatProvider provider)
    {
        if (arg is Complex)
        {
            Complex c1 = (Complex)arg;
            // Check if the format string has a precision specifier.
            int precision;
            string fmtString = String.Empty;
            if (format.Length > 1)
            {
                try
                {
                    precision = Int32.Parse(format.Substring(1));
                }
                catch (FormatException)
                {
                    precision = 0;
                }
                fmtString = "N" + precision.ToString();
            }
            if (format.Substring(0, 1).Equals("I", StringComparison.OrdinalIgnoreCase))
                return c1.Real.ToString(fmtString) + " + " + c1.Imaginary.ToString(fmtString) + "i";
            else if (format.Substring(0, 1).Equals("J", StringComparison.OrdinalIgnoreCase))
                return c1.Real.ToString(fmtString) + " + " + c1.Imaginary.ToString(fmtString) + "j";
            else
                return c1.ToString(format, provider);
        }
        else
        {
            if (arg is IFormattable)
                return ((IFormattable)arg).ToString(format, provider);
            else if (arg != null)
                return arg.ToString();
            else
                return String.Empty;
        }
    }
}
Imports System.Numerics

Public Class ComplexFormatter
    Implements IFormatProvider, ICustomFormatter

    Public Function GetFormat(formatType As Type) As Object _
                    Implements IFormatProvider.GetFormat
        If formatType Is GetType(ICustomFormatter) Then
            Return Me
        Else
            Return Nothing
        End If
    End Function

    Public Function Format(fmt As String, arg As Object,
                           provider As IFormatProvider) As String _
                    Implements ICustomFormatter.Format
        If TypeOf arg Is Complex Then
            Dim c1 As Complex = DirectCast(arg, Complex)
            ' Check if the format string has a precision specifier.
            Dim precision As Integer
            Dim fmtString As String = String.Empty
            If fmt.Length > 1 Then
                Try
                    precision = Int32.Parse(fmt.Substring(1))
                Catch e As FormatException
                    precision = 0
                End Try
                fmtString = "N" + precision.ToString()
            End If
            If fmt.Substring(0, 1).Equals("I", StringComparison.OrdinalIgnoreCase) Then
                Return c1.Real.ToString(fmtString) + " + " + c1.Imaginary.ToString(fmtString) + "i"
            ElseIf fmt.Substring(0, 1).Equals("J", StringComparison.OrdinalIgnoreCase) Then
                Return c1.Real.ToString(fmtString) + " + " + c1.Imaginary.ToString(fmtString) + "j"
            Else
                Return c1.ToString(fmt, provider)
            End If
        Else
            If TypeOf arg Is IFormattable Then
                Return DirectCast(arg, IFormattable).ToString(fmt, provider)
            ElseIf arg IsNot Nothing Then
                Return arg.ToString()
            Else
                Return String.Empty
            End If
        End If
    End Function
End Class

Aşağıdaki örnek daha sonra karmaşık bir sayının dize gösterimini görüntülemek için bu özel biçimlendiriciyi kullanır.

public class CustomFormatEx
{
    public static void Main()
    {
        Complex c1 = new Complex(12.1, 15.4);
        Console.WriteLine("Formatting with ToString():       " +
                          c1.ToString());
        Console.WriteLine("Formatting with ToString(format): " +
                          c1.ToString("N2"));
        Console.WriteLine("Custom formatting with I0:        " +
                          String.Format(new ComplexFormatter(), "{0:I0}", c1));
        Console.WriteLine("Custom formatting with J3:        " +
                          String.Format(new ComplexFormatter(), "{0:J3}", c1));
    }
}
// The example displays the following output:
//    Formatting with ToString():       (12.1, 15.4)
//    Formatting with ToString(format): (12.10, 15.40)
//    Custom formatting with I0:        12 + 15i
//    Custom formatting with J3:        12.100 + 15.400j
Module Example2
    Public Sub Main()
        Dim c1 As Complex = New Complex(12.1, 15.4)
        Console.WriteLine("Formatting with ToString():       " +
                          c1.ToString())
        Console.WriteLine("Formatting with ToString(format): " +
                          c1.ToString("N2"))
        Console.WriteLine("Custom formatting with I0:        " +
                          String.Format(New ComplexFormatter(), "{0:I0}", c1))
        Console.WriteLine("Custom formatting with J3:        " +
                          String.Format(New ComplexFormatter(), "{0:J3}", c1))
    End Sub
End Module
' The example displays the following output:
'    Formatting with ToString():       (12.1, 15.4)
'    Formatting with ToString(format): (12.10, 15.40)
'    Custom formatting with I0:        12 + 15i
'    Custom formatting with J3:        12.100 + 15.400j