Struktur System.Numerics.Complex

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Bilangan kompleks adalah angka yang terdiri dari bagian bilangan riil dan bagian angka imajiner. Bilangan kompleks z biasanya ditulis dalam bentuk z = x + yi, di mana x dan y adalah angka riil, dan i adalah unit imajiner yang memiliki properti i2 = -1. Bagian nyata dari bilangan kompleks diwakili oleh x, dan bagian imajiner dari bilangan kompleks diwakili oleh y.

Jenis ini Complex menggunakan sistem koordinat Kartesius (nyata, imajiner) saat membuat instans dan memanipulasi bilangan kompleks. Bilangan kompleks dapat direpresentasikan sebagai titik dalam sistem koordinat dua dimensi, yang dikenal sebagai bidang kompleks. Bagian nyata dari bilangan kompleks diposisikan pada sumbu x (sumbu horizontal), dan bagian imajiner diposisikan pada sumbu y (sumbu vertikal).

Setiap titik dalam bidang kompleks juga dapat diekspresikan berdasarkan nilai absolutnya, dengan menggunakan sistem koordinat kutub. Dalam koordinat kutub, titik ditandai dengan dua angka:

  • Besarnya, yang merupakan jarak titik dari asal (yaitu, 0,0, atau titik di mana sumbu x dan sumbu y bersinggungan).
  • Fasenya, yang merupakan sudut antara sumbu nyata dan garis yang digambar dari asal ke titik.

Membuat instans bilangan kompleks

Anda bisa menetapkan nilai ke bilangan kompleks dengan salah satu cara berikut:

  • Dengan meneruskan dua Double nilai ke konstruktornya. Nilai pertama mewakili bagian nyata dari bilangan kompleks, dan nilai kedua mewakili bagian imajinernya. Nilai-nilai ini mewakili posisi bilangan kompleks dalam sistem koordinat Kartesius dua dimensi.

  • Dengan memanggil metode statis (Shared dalam Visual Basic) Complex.FromPolarCoordinates untuk membuat bilangan kompleks dari koordinat kutubnya.

  • Dengan menetapkan Bytenilai , , SByte, Int16UInt16, Int32, UInt32, Int64, UInt64, Single, atau Double ke Complex objek . Nilai menjadi bagian nyata dari bilangan kompleks, dan bagian imajinernya sama dengan 0.

  • Dengan mentransmisikan (dalam C#) atau mengonversi (di Visual Basic) nilai Decimal atau BigInteger menjadi Complex objek. Nilai menjadi bagian nyata dari bilangan kompleks, dan bagian imajinernya sama dengan 0.

  • Dengan menetapkan bilangan kompleks yang dikembalikan oleh metode atau operator ke Complex objek. Misalnya, Complex.Add adalah metode statis yang mengembalikan bilangan kompleks yang merupakan jumlah dari dua bilangan kompleks, dan Complex.Addition operator menambahkan dua bilangan kompleks dan mengembalikan hasilnya.

Contoh berikut menunjukkan masing-masing dari lima cara menetapkan nilai ke bilangan kompleks.

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)

Operasi dengan bilangan kompleks

Struktur Complex dalam .NET mencakup anggota yang menyediakan fungsionalitas berikut:

  • Metode untuk membandingkan dua angka kompleks untuk menentukan apakah angka tersebut sama.
  • Operator untuk melakukan operasi aritmatika pada bilangan kompleks. Complex operator memungkinkan Anda melakukan penambahan, pengurangan, perkalian, pembagian, dan negasi unary dengan angka kompleks.
  • Metode untuk melakukan operasi numerik lainnya pada bilangan kompleks. Selain empat operasi aritmatika dasar, Anda dapat menaikkan bilangan kompleks ke daya tertentu, menemukan akar kuadrat dari bilangan kompleks, dan mendapatkan nilai absolut dari bilangan kompleks.
  • Metode untuk melakukan operasi trigonometri pada bilangan kompleks. Misalnya, Anda dapat menghitung tangen sudut yang diwakili oleh bilangan kompleks.

Perhatikan bahwa, karena Real properti dan Imaginary bersifat baca-saja, Anda tidak dapat mengubah nilai objek yang ada Complex . Semua metode yang melakukan operasi pada Complex angka, jika nilai pengembaliannya berjenis Complex, mengembalikan angka baru Complex .

Angka presisi dan kompleks

Bagian nyata dan imajiner dari bilangan kompleks diwakili oleh dua nilai floating-point presisi ganda. Ini berarti bahwa Complex nilai, seperti nilai floating-point presisi ganda, dapat kehilangan presisi sebagai akibat dari operasi numerik. Ini berarti bahwa perbandingan yang ketat untuk kesetaraan dua Complex nilai mungkin gagal, bahkan jika perbedaan antara kedua nilai disebabkan oleh hilangnya presisi. Untuk informasi selengkapnya, lihat Double .

Misalnya, melakukan eksponensiasi pada logaritma angka harus mengembalikan angka asli. Namun, dalam beberapa kasus, hilangnya presisi nilai floating-point dapat menyebabkan sedikit perbedaan antara dua nilai, seperti yang diilustrasikan contoh berikut.

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

Demikian pula, contoh berikut, yang menghitung akar kuadrat dari angka, menghasilkan hasil yang Complex sedikit berbeda pada versi .NET 32-bit dan IA64.

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.

Infinity dan NaN

Bagian nyata dan imajiner dari bilangan kompleks diwakili oleh Double nilai. Selain mulai dari Double.MinValue hingga Double.MaxValue, bagian nyata atau imajiner dari bilangan Double.PositiveInfinitykompleks dapat memiliki nilai , , Double.NegativeInfinityatau Double.NaN. Double.PositiveInfinity, Double.NegativeInfinity, dan Double.NaN semua menyebar dalam operasi aritmetika atau trigonometri apa pun.

Dalam contoh berikut, pembagian dengan Zero menghasilkan bilangan kompleks yang bagian nyata dan imajinernya adalah Double.NaN. Akibatnya, melakukan perkalian dengan nilai ini juga menghasilkan bilangan kompleks yang bagian nyata dan imajinernya adalah Double.NaN. Demikian pula, melakukan perkalian yang meluapkan rentang jenis menghasilkan bilangan Double kompleks yang bagian aslinya adalah Double.NaN dan yang bagian imajinernya adalah Double.PositiveInfinity. Kemudian melakukan pembagian dengan bilangan kompleks ini mengembalikan bilangan kompleks yang bagian aslinya adalah Double.NaN dan yang bagian imajinernya adalah Double.PositiveInfinity.

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)

Operasi matematika dengan angka kompleks yang tidak valid atau yang meluap rentang Double jenis data tidak memberikan pengecualian. Sebaliknya, mereka mengembalikan Double.PositiveInfinity, , Double.NegativeInfinityatau Double.NaN dalam kondisi berikut:

Perhatikan bahwa ini berlaku untuk perhitungan menengah apa pun yang dilakukan oleh metode . Misalnya, perkalian new Complex(9e308, 9e308) and new Complex(2.5, 3.5) menggunakan rumus (ac - bd) + (ad + bc)i. Perhitungan komponen nyata yang dihasilkan dari perkalian mengevaluasi ekspresi 9e308 2,5 - 9e308 3,5. Setiap perkalian menengah dalam ekspresi ini mengembalikan Double.PositiveInfinity, dan upaya untuk mengurangi Double.PositiveInfinity dari Double.PositiveInfinity pengembalian Double.NaN.

Memformat bilangan kompleks

Secara default, representasi string dari bilangan kompleks mengambil (bentuk imajiner) nyata,, di mana real dan imajiner adalah representasi string dari Double nilai yang membentuk komponen real dan imajiner bilangan kompleks. Beberapa kelebihan beban metode memungkinkan penyesuaian ToString representasi string dari nilai-nilai ini Double untuk mencerminkan konvensi pemformatan budaya tertentu atau muncul dalam format tertentu yang ditentukan oleh string format numerik standar atau kustom. (Untuk informasi selengkapnya, lihat String Format Numerik Standar dan String Format Numerik Kustom.)

Salah satu cara yang lebih umum untuk mengekspresikan representasi string dari bilangan kompleks mengambil bentuk + bi, di mana adalah komponen riil bilangan kompleks, dan b adalah komponen imajiner bilangan kompleks. Dalam rekayasa listrik, jumlah kompleks paling umum dinyatakan sebagai + bj. Anda dapat mengembalikan representasi string dari bilangan kompleks di salah satu dari dua formulir ini. Untuk melakukan ini, tentukan penyedia format kustom dengan menerapkan ICustomFormatter antarmuka dan IFormatProvider , lalu panggil String.Format(IFormatProvider, String, Object[]) metode .

Contoh berikut mendefinisikan ComplexFormatter kelas yang mewakili bilangan kompleks sebagai string dalam bentuk + bi atau + bj.

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

Contoh berikut kemudian menggunakan formatter kustom ini untuk menampilkan representasi string dari bilangan kompleks.

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