複數類的設計及其應用:複數類的設計

Author:水如煙

 

摘要:嘗試建立一個複數類,應用於複數運算、平面向量和平面座標系的轉換。 

複數類的設計

目的要求:

  1. 應方便輸入習慣
  2. 應滿足輸出要求
  3. 應與實際數學運算過程的形式保持一致

關鍵:發揮複數兩種表示方式的特點,注重複數幾何表示與平面向量的結合。

知識:複數常用的表示形式有兩種,一是定義式,即z=a+bi,其中a爲實部b爲虛部,二是指數式,即z=rExp(θi),其中r爲模θ爲輻角,兩者通過z=a+bi=r(cosθ+isinθ)來轉換. 在複數運算中,加減用定義式方便,乘除用指數式快捷,在開n次方求n次冪時,更是需要指數式.

注:在代碼的註釋中,定義式我稱爲實虛表示,而指數式稱爲模輻表示。 

困惑處:如何判斷一個向量是零向量,相應有如何判斷兩個向量相等。

以下爲代碼(VB.NET,MVS2005):

在VB.NET論壇中也有相應的代碼,地址好久沒寫代碼了,寫個複數類試試看

01、文件Complex.AngleUnitType.vb,角度單位

Namespace LzmTW.uMath

    
Partial Class Complex

        
''' <summary>
        ''' 角度單位
        ''' </summary>
        ''' <remarks></remarks>
        Public Enum AngleUnitType
            
''' <summary>
            ''' 弧度
            ''' </summary>
            [Default]
            
''' <summary>
            ''' 度
            ''' </summary>
            Degree
            
''' <summary>
            ''' PI單位弧度
            ''' </summary>
            PI
        
End Enum

    
End Class

End Namespace

02、文件Complex.FormatType.vb,輸出形式

Namespace LzmTW.uMath

    
Partial Class Complex

        
''' <summary>
        ''' 表示形式
        ''' </summary>
        ''' <remarks></remarks>
        Public Enum FormatType
            
''' <summary>
            ''' 代數定義,如 1 + 1i
            ''' </summary>
            ''' <remarks></remarks>
            Normal

            
''' <summary>
            ''' 座標標準定義,如 (1,1)
            ''' </summary>
            ''' <remarks></remarks>
            CoordinateNormal

            
''' <summary>
            ''' 座標模輻定義,弧度,如 (2,0.9)
            ''' </summary>
            ''' <remarks></remarks>
            CoordinateDefault

            
''' <summary>
            ''' 座標模輻定義,PI單位弧度,如 (2,0.5π)
            ''' </summary>
            ''' <remarks></remarks>
            CoordinatePI

            
''' <summary>
            ''' 座標模輻定義,度,如 (2,45°)
            ''' </summary>
            ''' <remarks></remarks>
            CoordinateDegree

            
''' <summary>
            ''' 三角,弧度,如 2(cos(0.9) + isin(0.9))
            ''' </summary>
            ''' <remarks></remarks>
            TriangleDefault

            
''' <summary>
            ''' 三角,PI單位弧度,如 2(cos(0.5π) + isin(0.5π))
            ''' </summary>
            ''' <remarks></remarks>
            TrianglePI

            
''' <summary>
            ''' 三角,度,如 2(cos(45°) + isin(45°))
            ''' </summary>
            ''' <remarks></remarks>
            TriangleDegree

            
''' <summary>
            ''' 指數,弧度,如 2Exp(0.9i)
            ''' </summary>
            ''' <remarks></remarks>
            ExponentDefault

            
''' <summary>
            ''' 指數,PI單位弧度,如 2Exp(0.5πi)
            ''' </summary>
            ''' <remarks></remarks>
            ExponentPI

            
''' <summary>
            ''' 指數,度,如 2Exp(45°i)
            ''' </summary>
            ''' <remarks></remarks>
            ExponentDegree
        
End Enum

    
End Class

End Namespace

 03、文件Complex.Const.vb,常數定義

Namespace LzmTW.uMath

    
Partial Class Complex

        
''' <summary>
        ''' π
        ''' </summary>
        ''' <remarks></remarks>
        Public Const d_PI As Double = Math.PI

        
''' <summary>
        ''' 2π
        ''' </summary>
        ''' <remarks></remarks>
        Public Const d_2PI As Double = Math.PI * 2

        
''' <summary>
        ''' π/2
        ''' </summary>
        ''' <remarks></remarks>
        Public Const d_PIHalf As Double = Math.PI / 2

        
''' <summary>
        ''' 1°
        ''' </summary>
        ''' <remarks></remarks>
        Public Const d_Degree As Double = Math.PI / 180

        
''' <summary>
        ''' e
        ''' </summary>
        ''' <remarks></remarks>
        Public Const d_E As Double = Math.E

        
''' <summary>
        ''' π字符
        ''' </summary>
        ''' <remarks></remarks>
        Public Const c_PI As String = "π"

        
''' <summary>
        ''' e字符
        ''' </summary>
        ''' <remarks></remarks>
        Public Const c_E As String = "exp"

        
''' <summary>
        ''' °字符
        ''' </summary>
        ''' <remarks></remarks>
        Public Const c_Degree As String = "°"

        
''' <summary>
        ''' i,虛單位字符
        ''' </summary>
        ''' <remarks></remarks>
        Public Const c_ImaginaryUnit As String = "i"
    
End Class

End Namespace

 04、文件Complex.Define.vb,全局性重要參數函數定義

 

Namespace LzmTW.uMath

    
Partial Class Complex

        
''' <summary>
        ''' 可認可的最大誤差
        ''' </summary>
        ''' <remarks>此參數非常重要。兩複數是否相等,判斷一個向量是否是零向量,皆參考它決定</remarks>
        Private Shared gAbsoluteZero As Double = 0.000000000000001 'PI是16位有效小數

        
''' <summary>
        ''' 最小認可誤差,小於等於此值可視爲零
        ''' </summary>
        Public Shared Property AbsoluteZero() As Double
            
Get
                
Return gAbsoluteZero
            
End Get

            
Set(ByVal value As Double)
                gAbsoluteZero 
= value
            
End Set
        
End Property

        
''' <summary>
        ''' 判斷數值可否作爲零處理
        ''' </summary>
        Public Shared Function IsEqualsAbsoluteZero(ByVal value As DoubleAs Boolean

            
Return Math.Abs(value) <= gAbsoluteZero
        
End Function
    
End Class

End Namespace


05、文件Complex.ComplexBase.vb,處理複數兩種方式的共用類

 

Namespace LzmTW.uMath

    
Partial Class Complex
        
Private MustInherit Class ComplexBase
            
Protected gIsZeroVector As Boolean '定義是否爲零向量。

            
Protected gMaster As Double '實部或模
            Protected gSecondary As Double '虛部或輻角

            
Protected gArg As Double   '如是用模輻表示,此爲輻角主值。如是實虛表示則不必處理此變量。

            
Private gRoundDigits As Integer = -1 '輸出小數有效位。在0至15之間。如是負數,則不取捨

            
Private Shared gGlobalRoundDigits As Integer = -1 '意義同上,只是它是全局性的。


            
''' <summary>
            ''' 顯示數據時輸出有效小數位,如小於零則不作取捨
            ''' </summary>
            Public Property RoundDigits() As Integer
                
Get
                    
Return gRoundDigits
                
End Get
                
Set(ByVal value As Integer)
                    
If value > 15 Then
                        gRoundDigits 
= 15
                    
Else
                        gRoundDigits 
= value
                    
End If
                
End Set
            
End Property

            
''' <summary>
            ''' 意義同RoundDigits.如此值大於等於零,參考此值;如小於零,則參考RoundDigits值。
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Shared Property GlobalRoundDigits() As Integer
                
Get
                    
Return gGlobalRoundDigits
                
End Get
                
Set(ByVal value As Integer)
                    
If value > 15 Then
                        gGlobalRoundDigits 
= 15
                    
Else
                        gGlobalRoundDigits 
= value
                    
End If
                
End Set
            
End Property

            
Sub New()
                
Me.InternalLoadData(00)
            
End Sub

            
Sub New(ByVal master As DoubleByVal secondary As Double)
                
'使用(模,輻角)表示時,模不能爲負值
                Me.InternalDoBeforeLoad(master, secondary)

                
Me.InternalLoadData(master, secondary)
            
End Sub

            
Protected Sub InternalLoadData(ByVal master As DoubleByVal secondary As Double)
                
Me.gMaster = master
                
Me.gSecondary = secondary

                
'使用(模,輻角)表示時,在此處理輻角主值
                InternalDoAfterLoad()

                
Me.CheckIsZeroVector()
            
End Sub

            
Private Sub CheckIsZeroVector()
                
Me.gIsZeroVector = InternalCheckIsZeroVector()
                
If Me.gIsZeroVector Then InternalDoIfIsZeroVector()
            
End Sub

#Region "有必要重載部分"

            
''' <summary>
            ''' 可以重載實現加載數據前的處理
            ''' </summary>
            Protected Overridable Sub InternalDoBeforeLoad(ByVal master As DoubleByVal secondary As Double)
            
End Sub

            
''' <summary>
            ''' 可以重載實現加載數據後的處理
            ''' </summary>
            Protected Overridable Sub InternalDoAfterLoad()
            
End Sub

            
''' <summary>
            ''' 可以重載當爲零向量時的處理
            ''' </summary>
            ''' <remarks></remarks>
            Protected Overridable Sub InternalDoIfIsZeroVector()
            
End Sub

            
''' <summary>
            ''' 判斷是否爲零向量
            ''' </summary>
            Protected MustOverride Function InternalCheckIsZeroVector() As Boolean

            
Overridable Sub Add(ByVal value As Object)
                
Me.CheckIsZeroVector()
            
End Sub

            
Overridable Sub Subtract(ByVal value As Object)
                
Me.CheckIsZeroVector()
            
End Sub

            
Overridable Sub Multy(ByVal value As Object)
                
Me.CheckIsZeroVector()
            
End Sub

            
Overridable Sub Divide(ByVal value As Object)
                
Me.CheckIsZeroVector()
            
End Sub
#End Region

#Region "數據輸出顯示處理"


            
Public Overloads Function ToString(ByVal format As FormatType) As String
                
If Me.gIsZeroVector Then Return "0"

                
Select Case format
                    
Case FormatType.Normal
                        
Return String.Concat(Me.RoundStringReal(gMaster), Me.RoundStringSign(gMaster, gSecondary), Me.RoundStringImaginary(gSecondary))

                    
Case FormatType.CoordinateNormal
                        
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gSecondary))

                    
Case FormatType.CoordinateDefault
                        
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg))

                    
Case FormatType.CoordinatePI
                        
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg, AngleUnitType.PI))

                    
Case FormatType.CoordinateDegree
                        
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg, AngleUnitType.Degree))

                    
Case FormatType.TriangleDefault
                        
Return RoundStringOther(True, AngleUnitType.Default)

                    
Case FormatType.TrianglePI
                        
Return RoundStringOther(True, AngleUnitType.PI)

                    
Case FormatType.TriangleDegree
                        
Return RoundStringOther(True, AngleUnitType.Degree)

                    
Case FormatType.ExponentDefault
                        
Return RoundStringOther(False, AngleUnitType.Default)

                    
Case FormatType.ExponentPI
                        
Return RoundStringOther(False, AngleUnitType.PI)

                    
Case FormatType.ExponentDegree
                        
Return RoundStringOther(False, AngleUnitType.Degree)

                
End Select

                
Return "format is invalid."
            
End Function

            
'實虛表示與以弧度單位的模輻表示,其處理過程一樣。
            '因此,可以借用AngleUnitType.Default來處理實虛部分。
            Private Function RoundString(ByVal value As DoubleOptional ByVal toUnit As AngleUnitType = AngleUnitType.Default) As String

                
Return AngleConvertStringFromDefault(value, toUnit, GetDigits)
            
End Function

            
Private Function RoundStringReal(ByVal value As DoubleAs String
                value 
= Complex.Round(value, GetDigits)

                
If value = 0 Then Return String.Empty

                
Return value.ToString
            
End Function

            
Private Function RoundStringSign(ByVal real As DoubleByVal imaginary As DoubleAs String
                real 
= Complex.Round(real, GetDigits)
                imaginary 
= Complex.Round(imaginary, GetDigits)

                
If real = 0 Then
                    
Select Case Math.Sign(imaginary)
                        
Case 01
                            
Return String.Empty

                        
Case -1
                            
Return "-"
                    
End Select
                
Else
                    
Select Case Math.Sign(imaginary)
                        
Case 0
                            
Return String.Empty

                        
Case 1
                            
Return " + "

                        
Case -1
                            
Return " - "
                    
End Select
                
End If

                
Return Nothing
            
End Function

            
Private Function RoundStringImaginary(ByVal value As DoubleAs String
                value 
= Math.Abs(Complex.Round(value, GetDigits))

                
If value = 0 Then Return String.Empty

                
If value = 1 OrElse value = -1 Then Return Complex.c_ImaginaryUnit

                
Return String.Concat(value, Complex.c_ImaginaryUnit)
            
End Function

            
Private Function RoundStringOther(ByVal isTriangle As BooleanByVal unit As AngleUnitType) As String
                
Dim mModulus As Double = Complex.Round(gMaster, GetDigits)
                
Dim mArg As Double = Complex.Round(gArg, GetDigits)

                
If isTriangle Then
                    
If mModulus = 1 Then Return String.Format("cos({0}) + {1}sin({0})", RoundString(mArg, unit), Complex.c_ImaginaryUnit)

                    
Return String.Format("{2}(cos({0}) + {1}sin({0}))", RoundString(mArg, unit), Complex.c_ImaginaryUnit, mModulus)

                
Else
                    
If mModulus = 1 Then Return String.Format("{2}({0}{1})", RoundString(mArg, unit), Complex.c_ImaginaryUnit, Complex.c_E)

                    
Return String.Format("{3}{2}({0}{1})", RoundString(mArg, unit), Complex.c_ImaginaryUnit, Complex.c_E, mModulus)
                
End If

                
Return Nothing
            
End Function

            
Private Function GetDigits() As Integer
                
If gGlobalRoundDigits < 0 Then Return gRoundDigits

                
Return gGlobalRoundDigits
            
End Function
#End Region

        
End Class

    
End Class

End Namespace



06、文件Complex.Complex1.vb,實現複數的實虛表示

 

Namespace LzmTW.uMath

    
Partial Class Complex
        
Private Class Complex1
            
Inherits ComplexBase

            
Sub New()
                
MyBase.New()
            
End Sub

            
Sub New(ByVal real As Double)
                
MyBase.New(real, 0)
            
End Sub

            
Sub New(ByVal real As DoubleByVal imaginary As Double)
                
MyBase.New(real, imaginary)
            
End Sub

            
''' <summary>
            ''' 實部
            ''' </summary>
            Public ReadOnly Property Real() As Double
                
Get
                    
Return Me.gMaster
                
End Get
            
End Property

            
''' <summary>
            ''' 虛部
            ''' </summary>
            Public ReadOnly Property Imaginary() As Double
                
Get
                    
Return Me.gSecondary
                
End Get
            
End Property

#Region "重載部分"

            
Protected Overrides Function InternalCheckIsZeroVector() As Boolean
                
Return Complex.IsEqualsAbsoluteZero(gMaster) AndAlso Complex.IsEqualsAbsoluteZero(gSecondary)
            
End Function

            
Public Overrides Sub Add(ByVal value As Object)
                
With CType(value, Complex1)
                    
Me.gMaster += .gMaster
                    
Me.gSecondary += .gSecondary
                
End With

                
MyBase.Add(value)
            
End Sub

            
Public Overrides Sub Divide(ByVal value As Object)
                
With CType(value, Complex1)
                    
Dim tmp As Double = .gMaster * .gMaster + .gSecondary * .gSecondary
                    
Dim mReal As Double = (Me.gMaster * .gMaster + Me.gSecondary * .gSecondary) / tmp
                    
Dim mImaginary As Double = (Me.gSecondary * .gMaster - Me.gMaster * .gSecondary) / tmp

                    
Me.gMaster = mReal
                    
Me.gSecondary = mImaginary
                
End With

                
MyBase.Divide(value)
            
End Sub

            
Public Overrides Sub Multy(ByVal value As Object)
                
With CType(value, Complex1)
                    
Dim tmpReal As Double = Me.gMaster * .gMaster - Me.gSecondary * .gSecondary
                    
Dim tmpImaginary As Double = Me.gSecondary * .gMaster + Me.gMaster * .gSecondary

                    
Me.gMaster = tmpReal
                    
Me.gSecondary = tmpImaginary
                
End With

                
MyBase.Multy(value)
            
End Sub

            
Public Overrides Sub Subtract(ByVal value As Object)
                
With CType(value, Complex1)
                    
Me.gMaster -= .gMaster
                    
Me.gSecondary -= .gSecondary
                
End With

                
MyBase.Subtract(value)
            
End Sub

#End Region

#Region "擴展部分"

            
Public Function ToComplex2() As Complex2
                
Dim mModulus As Double = Math.Sqrt(Me.Real * Me.Real + Me.Imaginary * Me.Imaginary)
                
Dim mArgument As Double = Math.Atan2(Me.Imaginary, Me.Real)

                
Return New Complex2(mModulus, mArgument)
            
End Function

#End Region


        
End Class
    
End Class

End Namespace


07、文件Complex.Complex2.vb,實現複數的模輻表示

 

Namespace LzmTW.uMath

    
Partial Class Complex
        
Private Class Complex2
            
Inherits ComplexBase

            
Public ReadOnly Property Modulus() As Double '
                Get
                    
Return Me.gMaster
                
End Get
            
End Property

            
Public ReadOnly Property Argument() As Double '輻角
                Get
                    
Return Me.gSecondary
                
End Get
            
End Property

            
Public ReadOnly Property Arg() As Double '輻角主值
                Get
                    
Return gArg
                
End Get
            
End Property

            
Sub New()
                
MyBase.new()
            
End Sub

            
Sub New(ByVal modulus As DoubleByVal argument As Double)
                
MyBase.New(modulus, argument)
            
End Sub

            
Sub New(ByVal modulus As DoubleByVal argument As DoubleByVal unitType As AngleUnitType)
                
MyBase.New(modulus, Complex.radian(argument, unitType))
            
End Sub

            
Private Sub UpdateArg()
                gArg 
= Complex.GetArgZ(Me.gSecondary)
            
End Sub

#Region "重載部分"
            
Protected Overrides Function InternalCheckIsZeroVector() As Boolean

                
Return Complex.IsEqualsAbsoluteZero(gMaster)
            
End Function

            
Protected Overrides Sub internalDoBeforeLoad(ByVal master As DoubleByVal secondary As Double)
                
If master < 0 Then

                    
Throw New Exception("模無效,不能爲負")
                
End If
            
End Sub

            
Protected Overrides Sub internalDoAfterLoad()

                
Me.UpdateArg()
            
End Sub

            
Public Overrides Sub Add(ByVal value As Object)
                
Dim mComplex1 As Complex1 = Me.ToComplex1
                
Dim mComplex11 As Complex1 = CType(value, Complex2).ToComplex1
                mComplex1.Add(mComplex11)

                
With mComplex1.ToComplex2
                    
Me.InternalLoadData(.Modulus, .Argument)
                
End With
            
End Sub

            
Public Overrides Sub Divide(ByVal value As Object)
                
With CType(value, Complex2)
                    
Dim mModulus As Double = Me.Modulus / .Modulus
                    
Dim mArgument As Double = Me.Argument - .Argument

                    
Me.InternalLoadData(mModulus, mArgument)
                
End With
            
End Sub

            
Public Overrides Sub Multy(ByVal value As Object)
                
With CType(value, Complex2)
                    
Dim mModulus As Double = Me.Modulus * .Modulus
                    
Dim mArgument As Double = Me.Argument + .Argument

                    
Me.InternalLoadData(mModulus, mArgument)
                
End With
            
End Sub

            
Public Overrides Sub Subtract(ByVal value As Object)
                
Dim mComplex1 As Complex1 = Me.ToComplex1
                
Dim mComplex11 As Complex1 = CType(value, Complex2).ToComplex1

                mComplex1.Subtract(mComplex11)

                
With mComplex1.ToComplex2
                    
Me.InternalLoadData(.Modulus, .Argument)
                
End With
            
End Sub
#End Region

#Region "擴展部分"

            
Public Function ToComplex1() As Complex1
                
Dim mReal As Double = Me.Modulus * cos(Me.Argument)
                
Dim mImaginary As Double = Me.Modulus * sin(Me.Argument)

                
Return New Complex1(mReal, mImaginary)
            
End Function

            
Public Sub Pow(ByVal n As Integer)
                
Dim mModulus As Double = Math.Pow(Me.Modulus, n)
                
Dim mArgument As Double = Me.Argument * n

                
Me.InternalLoadData(mModulus, mArgument)
            
End Sub

            
Public Function antPow(ByVal n As IntegerAs Complex2()
                
Dim mModulus As Double = Math.Pow(Me.Modulus, 1 / n)
                
Dim mArray(n - 1As Complex2

                
For i As Integer = 0 To n - 1
                    mArray(i) 
= New Complex2(mModulus, (Me.Arg + i * Complex.d_2PI) / n)
                
Next

                
Return mArray
            
End Function


            
Public Sub Reverse(ByVal radian As Double)
                
Me.gSecondary += radian
                
Me.UpdateArg()
            
End Sub
#End Region


            
Public ReadOnly Property IsZeroVector() As Boolean
                
Get
                    
Return Me.gIsZeroVector
                
End Get
            
End Property
        
End Class
    
End Class

End Namespace


08、文件Complex.vb,複數類的構造和基本屬性

 

Namespace LzmTW.uMath

    
Public Class Complex
        
Private gComplex1 As Complex1
        
Private gComplex2 As Complex2


        
''' <summary>
        ''' 實部
        ''' </summary>
        Public ReadOnly Property Real() As Double
            
Get
                
Return Me.gComplex1.Real
            
End Get
        
End Property

        
''' <summary>
        ''' 虛部
        ''' </summary>
        Public ReadOnly Property Imaginary() As Double
            
Get
                
Return Me.gComplex1.Imaginary
            
End Get
        
End Property

        
''' <summary>
        ''' 模
        ''' </summary>
        Public ReadOnly Property Modulus() As Double
            
Get
                
Return Me.gComplex2.Modulus
            
End Get
        
End Property

        
''' <summary>
        ''' 輻角,弧度
        ''' </summary>
        Public ReadOnly Property Argument() As Double
            
Get
                
Return Me.gComplex2.Argument
            
End Get
        
End Property

        
''' <summary>
        ''' 輻角主值,弧度
        ''' </summary>
        Public ReadOnly Property Arg() As Double
            
Get
                
Return Me.gComplex2.Arg
            
End Get
        
End Property

        
''' <summary>
        ''' 輸出有效小數位數。置爲-1則不作處理
        ''' </summary>
        Public WriteOnly Property RoundDigits() As Integer
            
Set(ByVal value As Integer)
                
Me.gComplex1.RoundDigits = value
                
Me.gComplex2.RoundDigits = value
            
End Set
        
End Property

        
''' <summary>
        ''' 輸出有效小數位數,全局性有效。置爲-1則無效,以RoundDigits爲準。
        ''' </summary>
        Public Shared WriteOnly Property GlobalRoundDigits() As Integer
            
Set(ByVal value As Integer)

                ComplexBase.GlobalRoundDigits 
= value
            
End Set
        
End Property

        
''' <summary>
        ''' 共軛複數
        ''' </summary>
        Public ReadOnly Property Conjugate() As Complex
            
Get
                
Return New Complex(Me.Real, -Me.Imaginary)
            
End Get
        
End Property

        
''' <summary>
        ''' 倒數
        ''' </summary>
        Public ReadOnly Property Reciprocal() As Complex
            
Get
                
Return 1 / Me
            
End Get
        
End Property


        
Sub New()
            gComplex1 
= New Complex1

            
Me.UpdateComplex2()
        
End Sub

        
Sub New(ByVal real As Double)
            gComplex1 
= New Complex1(real, 0)

            
Me.UpdateComplex2()
        
End Sub

        
Sub New(ByVal realOrModulus As DoubleByVal imaginaryOrArgument As DoubleOptional ByVal byModulus As Boolean = False)
            
If byModulus Then
                gComplex2 
= New Complex2(realOrModulus, imaginaryOrArgument)
                
Me.UpdateComplex1()
            
Else
                gComplex1 
= New Complex1(realOrModulus, imaginaryOrArgument)
                
Me.UpdateComplex2()
            
End If
        
End Sub

        
Private Sub UpdateComplex2()

            gComplex2 
= gComplex1.ToComplex2
        
End Sub

        
Private Sub UpdateComplex1()

            gComplex1 
= gComplex2.ToComplex1
        
End Sub

        
Public Shared Function Create(ByVal value As DoubleAs Complex
            
Return New Complex(value)
        
End Function

        
Public Shared Function Create( _
            
ByVal realOrModulus As Double, _
            
ByVal imaginaryOrArgument As Double, _
            
Optional ByVal byModulus As Boolean = False _
        ) 
As Complex

            
Return New Complex(realOrModulus, imaginaryOrArgument, byModulus)
        
End Function

        
Public Shared Function CreateByModulus( _
            
ByVal modulus As Double, _
            
ByVal argument As Double, _
            
Optional ByVal unitType As AngleUnitType = AngleUnitType.Default _
        ) 
As Complex

            
Return New Complex(modulus, radian(argument, unitType), True)
        
End Function

        
Public Function Clone() As Complex
            
Return New Complex(Me.Real, Me.Imaginary)
        
End Function


        
''' <summary>
        ''' 虛數單位,實部爲0,虛部爲1
        ''' </summary>
        Public Shared ReadOnly Property iUnitComplex() As Complex
            
Get
                
Return New Complex(01)
            
End Get
        
End Property

        
''' <summary>
        ''' 實虛部皆爲0
        ''' </summary>
        Public Shared ReadOnly Property ZeroComplex() As Complex
            
Get
                
Return New Complex(00)
            
End Get
        
End Property

        
''' <summary>
        ''' 實虛部皆爲1
        ''' </summary>
        Public Shared ReadOnly Property OneComplex() As Complex
            
Get
                
Return New Complex(11)
            
End Get
        
End Property

        
''' <summary>
        ''' 是否爲零向量
        ''' </summary>
        ''' <remarks>在引入向量概念時使用</remarks>        
        Friend ReadOnly Property InternalIsZeroVector() As Boolean
            
Get
                
Return gComplex2.IsZeroVector
            
End Get
        
End Property
    
End Class

End Namespace


09、文件Complex.Operate.vb,複數類的運算操作

 

Namespace LzmTW.uMath

    
Partial Class Complex
#Region "加法"
        
Public Function Add(ByVal other As Complex) As Complex
            
Me.gComplex1.Add(other.gComplex1)

            
Me.UpdateComplex2()

            
Return Me
        
End Function

        
Public Function Add(ByVal value As DoubleAs Complex

            
Return Me.Add(Create(value))
        
End Function

        
Public Function Add( _
            
ByVal realOrModulus As Double, _
            
ByVal imaginaryOrArgument As Double, _
            
Optional ByVal byModulus As Boolean = False _
        ) 
As Complex

            
Return Me.Add(Create(realOrModulus, imaginaryOrArgument, byModulus))
        
End Function

        
Public Shared Function Add(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
            
Dim z3 As Complex = z1.Clone
            z3.Add(z2)

            
Return z3
        
End Function

        
Public Shared Operator +(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

            
Return Add(z1, z2)
        
End Operator
#End Region

#Region "減法"
        
Public Function Subtract(ByVal other As Complex) As Complex
            
Me.gComplex1.Subtract(other.gComplex1)

            
Me.UpdateComplex2()

            
Return Me
        
End Function

        
Public Function Subtract(ByVal value As DoubleAs Complex

            
Return Me.Subtract(Create(value))
        
End Function

        
Public Function Subtract( _
            
ByVal realOrModulus As Double, _
            
ByVal imaginaryOrArgument As Double, _
            
Optional ByVal byModulus As Boolean = False _
        ) 
As Complex

            
Return Me.Subtract(Create(realOrModulus, imaginaryOrArgument, byModulus))
        
End Function

        
Public Shared Function Subtract(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
            
Dim z3 As Complex = z1.Clone
            z3.Subtract(z2)
            
Return z3
        
End Function

        
Public Shared Operator -(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
            
Return Subtract(z1, z2)
        
End Operator

#End Region

#Region "剩法"
        
Public Function Multy(ByVal other As Complex, Optional ByVal byModulus As Boolean = TrueAs Complex
            
If byModulus Then
                
Me.gComplex2.Multy(other.gComplex2)

                
Me.UpdateComplex1()
            
Else
                
Me.gComplex1.Multy(other.gComplex1)

                
Me.UpdateComplex2()
            
End If

            
Return Me
        
End Function

        
Public Function Multy(ByVal value As DoubleAs Complex

            
Return Me.Multy(Create(value))
        
End Function

        
Public Function Multy( _
            
ByVal realOrModulus As Double, _
            
ByVal imaginaryOrArgument As Double, _
            
Optional ByVal byModulus As Boolean = True _
        ) 
As Complex

            
Return Me.Multy(Create(realOrModulus, imaginaryOrArgument, byModulus))
        
End Function

        
Public Shared Function Multy(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
            
Dim z3 As Complex = z1.Clone
            z3.Multy(z2)

            
Return z3
        
End Function

        
Public Shared Operator *(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

            
Return Multy(z1, z2)
        
End Operator
#End Region

#Region "除法"
        
Public Function Divide(ByVal other As Complex, Optional ByVal byModulus As Boolean = TrueAs Complex
            
If byModulus Then
                
Me.gComplex2.Divide(other.gComplex2)

                
Me.UpdateComplex1()
            
Else
                
Me.gComplex1.Divide(other.gComplex1)

                
Me.UpdateComplex2()
            
End If

            
Return Me
        
End Function

        
Public Function Divide(ByVal value As DoubleAs Complex

            
Return Me.Divide(Create(value))
        
End Function

        
Public Function Divide( _
            
ByVal realOrModulus As Double, _
            
ByVal imaginaryOrArgument As Double, _
            
Optional ByVal byModulus As Boolean = True _
        ) 
As Complex

            
Return Me.Divide(Create(realOrModulus, imaginaryOrArgument, byModulus))
        
End Function

        
Public Shared Function Divide(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
            
Dim z3 As Complex = z1.Clone
            z3.Divide(z2)

            
Return z3
        
End Function

        
Public Shared Operator /(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

            
Return Divide(z1, z2)
        
End Operator
#End Region

#Region "n次冪"
        
Public Function Pow(ByVal n As IntegerAs Complex
            
Me.gComplex2.Pow(n)

            
Me.UpdateComplex1()

            
Return Me
        
End Function

        
Public Shared Function Pow(ByVal z As Complex, ByVal n As IntegerAs Complex
            
Dim z3 As Complex = z.Clone
            z3.Pow(n)

            
Return z3
        
End Function


        
Public Function Pow2() As Complex
            
Me.Pow(2)

            
Return Me
        
End Function
#End Region

#Region "實數二次開方"

        
Public Shared Function Sqrt(ByVal value As DoubleAs Complex()
            
If value < 0 Then
                
Dim mImaginary As Double = Math.Sqrt(-value)

                
Return New Complex() {New Complex(0, mImaginary), New Complex(0-mImaginary)}
            
Else

                
Return New Complex() {New Complex(Math.Sqrt(value), 0)}
            
End If
        
End Function

#End Region

#Region "n次開方"

        
Public Function antPow(ByVal n As IntegerAs Complex()
            
Dim tmpArray() As Complex2 = Me.gComplex2.antPow(n)

            
Dim mArray(n - 1As Complex
            
For i As Integer = 0 To n - 1
                
With tmpArray(i)

                    mArray(i) 
= New Complex(.Modulus, .Argument, True)
                
End With
            
Next

            
Return mArray
        
End Function

        
Public Shared Function antPow(ByVal z As Complex, ByVal n As IntegerAs Complex()
            
Dim z3 As Complex = z.Clone

            
Return z3.antPow(n)
        
End Function

#End Region

#Region "兩複數是否相等"

        
Public Shared Operator <>(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean
            
If Complex.IsEqualsAbsoluteZero(z1.Real - z2.Real) Then

                
Return Not Complex.IsEqualsAbsoluteZero(z1.Imaginary - z2.Imaginary)
            
End If

            
Return True
        
End Operator

        
Public Shared Operator =(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean

            
Return Not (z1 <> z2)
        
End Operator

#End Region


        
''' <summary>
        ''' 逆旋
        ''' </summary>
        Public Function Reverse(ByVal value As DoubleOptional ByVal unitType As AngleUnitType = AngleUnitType.Default) As Complex
            
Me.gComplex2.Reverse(Complex.radian(value, unitType))

            
Me.UpdateComplex1()

            
Return Me
        
End Function

        
Public Shared Function Reverse( _
            
ByVal z As Complex, _
            
ByVal value As Double, _
            
Optional ByVal unitType As AngleUnitType = AngleUnitType.Default _
        ) 
As Complex

            
Return z.Clone.Reverse(value, unitType)
        
End Function

        
'反轉,即逆轉180°
        Public Function Rollback() As Complex
            
Me.Reverse(Complex.d_PI)

            
Return Me
        
End Function

        
'-z,表示z反轉後的新實例
        Public Shared Operator -(ByVal z As Complex) As Complex

            
Return z.Clone.Rollback
        
End Operator

    
End Class

End Namespace


10、文件Complex.Methods.vb,複數類的輔助方法

Namespace LzmTW.uMath
    
'通用函數
    Partial Class Complex

        
Public Shared Function radian(ByVal value As DoubleOptional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double

            
Return AngleConvertToDefault(value, fromUnit)
        
End Function

        
Public Shared Function cos(ByVal value As DoubleOptional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double

            
Return Math.Cos(radian(value, fromUnit))
        
End Function

        
Public Shared Function sin(ByVal value As DoubleOptional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double

            
Return Math.Sin(radian(value, fromUnit))
        
End Function


        
Public Shared Function DivRem(ByVal a As DoubleByVal b As DoubleAs Double
            
Dim mNum As Double = Math.Floor(a / b)
            
Return a - b * mNum

            
'Return Math.IEEERemainder(a, b)
        End Function

        
'取輻角主值,在[0,2pi)
        Public Shared Function GetArgZ(ByVal argument As DoubleAs Double
            
Return Complex.DivRem(argument, Complex.d_2PI)
        
End Function

#Region "角度轉換"

        
Public Shared Function AngleConvertToDefault(ByVal value As DoubleByVal fromUnit As AngleUnitType) As Double

            
Return AngleConvert(value, fromUnit, AngleUnitType.Default)
        
End Function

        
Public Shared Function AngleConvertFromDefault(ByVal value As DoubleByVal toUnit As AngleUnitType) As Double

            
Return AngleConvert(value, AngleUnitType.Default, toUnit)
        
End Function

        
Public Shared Function Round(ByVal value As DoubleByVal digits As IntegerAs Double
            
If Complex.IsEqualsAbsoluteZero(value) Then Return 0

            
If Math.Sign(digits) = -1 Then Return value

            
If digits > 15 Then digits = 15

            
Return Math.Round(value, digits)
        
End Function

        
Public Shared Function AngleConvertStringFromDefault( _
            
ByVal value As Double, _
            
ByVal toUnit As AngleUnitType, _
            
Optional ByVal roundDigits As Integer = -1 _
        ) 
As String

            
Dim mValue As Double = Round(AngleConvertFromDefault(value, toUnit), roundDigits)

            
Select Case toUnit

                
Case AngleUnitType.Degree
                    
Return mValue.ToString & c_Degree

                
Case AngleUnitType.PI
                    
Return mValue.ToString & c_PI

                
Case AngleUnitType.Default
                    
Return mValue.ToString

            
End Select

            
Return "toUnit is invliad."
        
End Function

        
Public Shared Function AngleConvert( _
            
ByVal value As Double, _
            
ByVal fromUnit As AngleUnitType, _
            
ByVal toUnit As AngleUnitType _
        ) 
As Double

            
Return ((value * UnitsPerRadian(toUnit)) / UnitsPerRadian(fromUnit))
        
End Function

        
''' <summary>
        '''  單位轉換
        ''' </summary>
        Private Shared Function UnitsPerRadian(ByVal unit As AngleUnitType) As Double
            
Select Case unit
                
Case AngleUnitType.Default
                    
Return 1

                
Case AngleUnitType.PI
                    
Return 1 / Complex.d_PI

                
Case AngleUnitType.Degree
                    
Return 1 / Complex.d_Degree

            
End Select

            
Return Double.NaN
        
End Function

#End Region

    
End Class


End Namespace


11、文件Complex.ToString.vb,複數類的輸出類型

Namespace LzmTW.uMath

    
Partial Class Complex
        
Public Overrides Function ToString() As String
            
Return ToString(FormatType.Normal)
        
End Function

        
Public Overloads Function ToString(ByVal format As FormatType) As String
            
Select Case format
                
Case FormatType.Normal
                    
Return Me.gComplex1.ToString(FormatType.Normal)



                
Case FormatType.CoordinateNormal
                    
Return Me.gComplex1.ToString(FormatType.CoordinateNormal)

                
Case FormatType.CoordinateDefault
                    
Return Me.gComplex2.ToString(FormatType.CoordinateDefault)

                
Case FormatType.CoordinatePI
                    
Return Me.gComplex2.ToString(FormatType.CoordinatePI)

                
Case FormatType.CoordinateDegree
                    
Return Me.gComplex2.ToString(FormatType.CoordinateDegree)



                
Case FormatType.TriangleDefault
                    
Return Me.gComplex2.ToString(FormatType.TriangleDefault)

                
Case FormatType.TrianglePI
                    
Return Me.gComplex2.ToString(FormatType.TrianglePI)

                
Case FormatType.TriangleDegree
                    
Return Me.gComplex2.ToString(FormatType.TriangleDegree)



                
Case FormatType.ExponentDefault
                    
Return Me.gComplex2.ToString(FormatType.ExponentDefault)

                
Case FormatType.ExponentPI
                    
Return Me.gComplex2.ToString(FormatType.ExponentPI)

                
Case FormatType.ExponentDegree
                    
Return Me.gComplex2.ToString(FormatType.ExponentDegree)
            
End Select

            
Return "format is invalid."
        
End Function
    
End Class

End Namespace

 

以下爲該複數類的應用示例:

Imports LzmTW.uMath
Imports LzmTW.uMath.Complex

Public Class Test

    
'sqrt(3)-i 的三次方等於 -8i
    Public Sub Do1()
        
Dim z1 As New Complex(Math.Sqrt(3), +11)
        
Dim result As Complex
        PrintOut(z1, 
2)

        result 
= Pow(z1, 3)
        PrintOut(result, 
2)

        result 
= z1 * z1 * z1
        PrintOut(result, 
2)

        PrintOut(z1, 
2)

        PrintOut(Complex.OneComplex, 
2)

        PrintOut(Complex.ZeroComplex, 
2)

        PrintOut(Complex.iUnitComplex, 
2)
    
End Sub

    
'(1—2i)(3+4i)(11+2i)=125
    Public Sub Do2()
        
Dim z1 As New Complex(1-2)
        
Dim z2 As New Complex(34)
        
Dim z3 As New Complex(112)

        
Dim result As Complex = z1 * z2 * z3
        PrintOut(result, 
2)

        result 
= z1.Clone
        result.Multy(z2)
        result.Multy(z3)
        PrintOut(result, 
2)

        result 
= z1.Clone
        result.Multy(z2, 
True)
        result.Multy(z3, 
True)
        PrintOut(result, 
2)
    
End Sub

    
'(1+2i)÷(3—4i)=-0.2+0.4i
    Public Sub Do3()
        
Dim z1 As New Complex(12)
        
Dim z2 As New Complex(3-4)

        
Dim result As Complex = z1 / z2
        PrintOut(result, 
2)

        result 
= z1.Clone
        result.Divide(z2)
        PrintOut(result, 
2)

        result 
= z1.Clone
        result.Divide(z2, 
True)
        PrintOut(result, 
2)
    
End Sub

    
Public Sub do4()
        
Dim z1 As New Complex(34)
        
Dim z2 As Complex = z1.Conjugate

        
Dim result As Complex = z1 * z2
        Console.WriteLine(result)
    
End Sub

    
Public Sub Do5()
        
Dim z1 As New Complex(34True)

        
Dim result As Complex = z1.Clone
        
For i As Integer = 0 To 98
            result.Multy(z1)
        
Next
        PrintOut(result, 
2)

        result 
= z1.Clone
        
For i As Integer = 0 To 98
            result.Multy(z1, 
True)
        
Next
        PrintOut(result, 
2)

        result 
= z1.Clone
        result.Pow(
100)
        PrintOut(result, 
2)
    
End Sub

    
Public Sub Do6()
        
Dim z1 As New Complex(34True)
        Console.WriteLine(z1 
= z1.Conjugate)
        Console.WriteLine(z1 
= z1.Conjugate.Conjugate)
    
End Sub

    
Public Sub Do7()

        
For Each z As Complex In Create(0-8).antPow(3)
            z.RoundDigits 
= 2
            Console.WriteLine(z.ToString(FormatType.ExponentPI))
        
Next
    
End Sub

    
'z1=1+i,求z=(z1平方-3z1+6)/(1+z1)的輻角主值.結果爲z=1-i
    Public Sub Do8()
        
Dim z1 As New Complex(11)
        
Dim result As Complex
        result 
= (z1 * z1 - 3 * z1 + 6/ (1 + z1)
        result.RoundDigits 
= 2
        Console.WriteLine(result)
    
End Sub

    
'已知複數z=cos20°+ ising20°,求|z-z2+z3-z4+z5-z6+z7-z8+z9-z10|.
    '式中zn表示z的n次方,如z8表示z的8次方。
    '答案爲1。 

    
Public Sub Do9()
        
Dim z As Complex
        z 
= CreateByModulus(120, AngleUnitType.Degree)
        
Dim result As Complex

        
'方法一。用指數運算
        result = z - Pow(z, 2) _
                
+ Pow(z, 3- Pow(z, 4) _
                
+ Pow(z, 5- Pow(z, 6) _
                
+ Pow(z, 7- Pow(z, 8) _
                
+ Pow(z, 9- Pow(z, 10)

        Console.WriteLine(result)
        Console.WriteLine(result.ToString(FormatType.TriangleDefault))
        Console.WriteLine(result.ToString(FormatType.TriangleDegree))
        Console.WriteLine(result.ToString(FormatType.TrianglePI))
        Console.WriteLine(result.Modulus)

        
'方法二。標準運算
        Dim tmp As Complex
        tmp 
= z.Clone
        tmp.Multy(z) 
'2
        result = z - tmp
        tmp.Multy(z) 
'3
        result += tmp
        tmp.Multy(z) 
'4
        result -= tmp
        tmp.Multy(z) 
'5
        result += tmp
        tmp.Multy(z) 
'6
        result -= tmp
        tmp.Multy(z) 
'7
        result += tmp
        tmp.Multy(z) 
'8
        result -= tmp
        tmp.Multy(z) 
'9
        result += tmp
        tmp.Multy(z) 
'10
        result -= tmp

        Console.WriteLine()
        Console.WriteLine(result)
        Console.WriteLine(result.ToString(FormatType.TriangleDefault))
        Console.WriteLine(result.ToString(FormatType.TriangleDegree))
        Console.WriteLine(result.ToString(FormatType.TrianglePI))
        Console.WriteLine(result.Modulus)
    
End Sub

    
'已知z=cos(pi/3) + isin(pi/3)
    '求|z + 2Z2 + 3Z3 + ... + 12Z12|
    '式中zn表示z的n次方,如3z3表示z的3次方再乘3。
    '答案爲12
    Public Sub Do10()
        
Dim z As Complex
        z 
= CreateByModulus(11 / 3, AngleUnitType.PI)
        
Dim result As Complex = ZeroComplex

        
'方法一。指數運算
        For i As Integer = 1 To 12
            result 
+= i * Pow(z, i)
        
Next
        Console.WriteLine(result)
        Console.WriteLine(result.ToString(FormatType.ExponentDefault))
        Console.WriteLine(result.ToString(FormatType.ExponentPI))
        Console.WriteLine(result.ToString(FormatType.ExponentDegree))
        Console.WriteLine(result.Modulus)


        
'方法二。標準運算
        result = z.Clone
        
Dim tmp As Complex = z.Clone
        
For i As Integer = 2 To 12
            tmp.Multy(z)
            result.Add(i 
* tmp)
        
Next

        Console.WriteLine()
        Console.WriteLine(result)
        Console.WriteLine(result.ToString(FormatType.ExponentDefault))
        Console.WriteLine(result.ToString(FormatType.ExponentPI))
        Console.WriteLine(result.ToString(FormatType.ExponentDegree))
        Console.WriteLine(result.Modulus)

    
End Sub

    
'已知(1 + i) z4 = i
    '求z
    '式中z4表示z的4次方。
    '答案爲
    'z1=A(cos(1/16pi) + i sin(1/16pi))
    'z2=A(cos(9/16pi) + i sin(9/16pi))
    'z3=A(cos(17/16pi) + i sin(17/16pi))
    'z4=A(cos(25/16pi) + i sin(25/16pi))
    '其中A爲2的8次開方分之一
    Public Sub Do11()
        
Dim m1 As Double = 1 / Math.Pow(21 / 8)
        Console.WriteLine(CreateByModulus(m1, 
1 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
        Console.WriteLine(CreateByModulus(m1, 
9 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
        Console.WriteLine(CreateByModulus(m1, 
17 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
        Console.WriteLine(CreateByModulus(m1, 
25 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))

        
Dim z As New Complex(11)
        
Dim result As Complex() = antPow(iUnitComplex / z, 4)
        Console.WriteLine()

        
For Each c As Complex In result
            Console.WriteLine(c.ToString(FormatType.TrianglePI))
        
Next

    
End Sub

    
'已知z=1+i
    '求(z2-3z+6)/(z+1)的輻角主值
    '答案爲得7/4pi
    Public Sub Do12()
        Console.WriteLine(
7 / 4)
        Console.WriteLine()

        
Dim z As Complex = OneComplex
        
Dim result As Complex
        result 
= (z * z - 3 * z + 6/ (1 + z)

        Console.WriteLine(result.ToString(FormatType.ExponentPI))
    
End Sub

    
'化複數 -1/2(sin(1/3pi)+icos(1/3pi))爲代數形式和三解形式
    '答案爲-3的開方/4-1/4i;1/2(cos(7/6pi)+isin(7/6pi))
    Public Sub Do13()
        
Dim tmp As New Complex(1 / 27 / 6 * d_PI, True)
        Console.WriteLine(tmp.ToString)
        Console.WriteLine(tmp.ToString(FormatType.TrianglePI))
        Console.WriteLine()

        
Dim a As Double = -1 / 2 * sin(1 / 3, AngleUnitType.PI)
        
Dim b As Double = -1 / 2 * cos(1 / 3, AngleUnitType.PI)
        
Dim z As New Complex(a, b)

        Console.WriteLine(z.ToString)
        Console.WriteLine(z.ToString(FormatType.TrianglePI))
    
End Sub


    
Public Sub PrintOut(ByVal z As Complex, ByVal digits As Integer)



        Console.WriteLine()
        z.RoundDigits 
= digits
        Console.WriteLine(z.ToString(FormatType.Normal))
        Console.WriteLine(z.ToString(FormatType.CoordinateNormal))
        Console.WriteLine(z.ToString(FormatType.CoordinateDefault))
        Console.WriteLine(z.ToString(FormatType.CoordinatePI))
        Console.WriteLine(z.ToString(FormatType.CoordinateDegree))
        Console.WriteLine(z.ToString(FormatType.TriangleDefault))
        Console.WriteLine(z.ToString(FormatType.TrianglePI))
        Console.WriteLine(z.ToString(FormatType.TriangleDegree))
        Console.WriteLine(z.ToString(FormatType.ExponentDefault))
        Console.WriteLine(z.ToString(FormatType.ExponentPI))
        Console.WriteLine(z.ToString(FormatType.ExponentDegree))
    
End Sub

End Class
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章