diff --git a/src/FSharp/complex.fs b/src/FSharp/complex.fs index 65707075..949bf9d7 100644 --- a/src/FSharp/complex.fs +++ b/src/FSharp/complex.fs @@ -10,7 +10,9 @@ namespace MathNet.Numerics open Microsoft.FSharp.Math open System open System.Globalization + open System.Numerics + (* [] [] type Complex(real: float, imaginary: float) = @@ -34,10 +36,16 @@ namespace MathNet.Numerics | _ -> false override x.GetHashCode() = (hash x.r >>> 5) ^^^ (hash x.r <<< 3) ^^^ (((hash x.i >>> 4) ^^^ (hash x.i <<< 4)) + 0x9e3779b9) - + *) type complex = Complex + [] + module private ComplexExtensionsBasic = + type Complex with + member x.r = x.Real + member x.i = x.Imaginary + [] module Complex = let mkRect(a,b) = new Complex(a,b) @@ -98,34 +106,30 @@ namespace MathNet.Numerics let tan x = let exp2ix = exp(iscale 2.0 x) in (div (sub exp2ix one) (add exp2ix one)) |> iscale -1.0 - - type Complex with - static member Create(a,b) = Complex.mkRect (a,b) - static member CreatePolar(a,b) = Complex.mkPolar (a,b) - member x.Magnitude = Complex.magnitude x - member x.Phase = Complex.phase x - member x.RealPart = x.r - member x.ImaginaryPart = x.i - member x.Conjugate = Complex.conjugate x - - static member Sin(x) = Complex.sin(x) - static member Cos(x) = Complex.cos(x) - static member Abs(x) = Complex.abs(x) - static member Tan(x) = Complex.tan(x) - static member Log(x) = Complex.log(x) - static member Exp(x) = Complex.exp(x) - static member Sqrt(x) = Complex.sqrt(x) + [] + module ComplexExtensions = + type Complex with + member x.r = x.Real + member x.i = x.Imaginary + static member Create(a,b) = Complex.mkRect (a,b) + static member CreatePolar(a,b) = Complex.mkPolar (a,b) + member x.Magnitude = Complex.magnitude x + member x.Phase = Complex.phase x + member x.RealPart = x.r + member x.ImaginaryPart = x.i + member x.Conjugate = Complex.conjugate x + + static member Sin(x) = Complex.sin(x) + static member Cos(x) = Complex.cos(x) + static member Abs(x) = Complex.abs(x) + static member Tan(x) = Complex.tan(x) + static member Log(x) = Complex.log(x) + static member Exp(x) = Complex.exp(x) + static member Sqrt(x) = Complex.sqrt(x) - static member Zero = Complex.zero - static member One = Complex.one - static member OneI = Complex.onei - static member ( + ) (a,b) = Complex.add a b - static member ( - ) (a,b) = Complex.sub a b - static member ( * ) (a,b) = Complex.mul a b - static member ( / ) (a,b) = Complex.div a b - static member ( ~- ) a = Complex.neg a - static member ( * ) (a,b) = Complex.smul a b - static member ( * ) (a,b) = Complex.muls a b + static member Zero = Complex.zero + static member One = Complex.one + static member OneI = Complex.onei module ComplexTopLevelOperators = diff --git a/src/FSharp/complex.fsi b/src/FSharp/complex.fsi index 185d9c5e..fd916ef3 100644 --- a/src/FSharp/complex.fsi +++ b/src/FSharp/complex.fsi @@ -6,66 +6,71 @@ namespace MathNet.Numerics open System - - /// The type of complex numbers stored as pairs of 64-bit floating point numbers in rectangular coordinates - [] - [] - type Complex = - /// The real part of a complex number - member r: float - /// The imaginary part of a complex number - member i: float - /// The polar-coordinate magnitude of a complex number - member Magnitude: float - /// The polar-coordinate phase of a complex number - member Phase: float - /// The real part of a complex number - member RealPart: float - /// The imaginary part of a complex number - member ImaginaryPart: float - /// The conjugate of a complex number, i.e. x-yi - member Conjugate: Complex - /// Create a complex number x+ij using rectangular coordinates - static member Create : float * float -> Complex - /// Create a complex number using magnitude/phase polar coordinates - static member CreatePolar : float * float -> Complex - /// The complex number 0+0i - static member Zero : Complex - /// The complex number 1+0i - static member One : Complex - /// The complex number 0+1i - static member OneI : Complex - /// Add two complex numbers - static member ( + ) : Complex * Complex -> Complex - /// Subtract one complex number from another - static member ( - ) : Complex * Complex -> Complex - /// Multiply two complex numbers - static member ( * ) : Complex * Complex -> Complex - /// Complex division of two complex numbers - static member ( / ) : Complex * Complex -> Complex - /// Unary negation of a complex number - static member ( ~- ) : Complex -> Complex - /// Multiply a scalar by a complex number - static member ( * ) : float * Complex -> Complex - /// Multiply a complex number by a scalar - static member ( * ) : Complex * float -> Complex - - static member Sin : Complex -> Complex - static member Cos : Complex -> Complex + open System.Numerics + + [] + module ComplexExtensions = + /// The type of complex numbers stored as pairs of 64-bit floating point numbers in rectangular coordinates + type Complex with + /// The real part of a complex number + member r: float + /// The imaginary part of a complex number + member i: float + /// The polar-coordinate magnitude of a complex number + member Magnitude: float + /// The polar-coordinate phase of a complex number + member Phase: float + /// The real part of a complex number + member RealPart: float + /// The imaginary part of a complex number + member ImaginaryPart: float + /// The conjugate of a complex number, i.e. x-yi + member Conjugate: Complex + /// Create a complex number x+ij using rectangular coordinates + static member Create : float * float -> Complex + /// Create a complex number using magnitude/phase polar coordinates + static member CreatePolar : float * float -> Complex + /// The complex number 0+0i + static member Zero : Complex + /// The complex number 1+0i + static member One : Complex + /// The complex number 0+1i + static member OneI : Complex + (* + /// Add two complex numbers + static member ( + ) : Complex * Complex -> Complex + /// Subtract one complex number from another + static member ( - ) : Complex * Complex -> Complex + /// Multiply two complex numbers + static member ( * ) : Complex * Complex -> Complex + /// Complex division of two complex numbers + static member ( / ) : Complex * Complex -> Complex + /// Unary negation of a complex number + static member ( ~- ) : Complex -> Complex + /// Multiply a scalar by a complex number + static member ( * ) : float * Complex -> Complex + /// Multiply a complex number by a scalar + static member ( * ) : Complex * float -> Complex + *) + + static member Sin : Complex -> Complex + static member Cos : Complex -> Complex - /// Computes the absolute value of a complex number: e.g. Abs x+iy = sqrt(x**2.0 + y**2.0.) - /// Note: Complex.Abs(z) is the same as z.Magnitude - static member Abs : Complex -> float - static member Tan : Complex -> Complex - static member Log : Complex -> Complex - static member Exp : Complex -> Complex - static member Sqrt : Complex -> Complex + /// Computes the absolute value of a complex number: e.g. Abs x+iy = sqrt(x**2.0 + y**2.0.) + /// Note: Complex.Abs(z) is the same as z.Magnitude + static member Abs : Complex -> float + static member Tan : Complex -> Complex + static member Log : Complex -> Complex + static member Exp : Complex -> Complex + static member Sqrt : Complex -> Complex - override ToString : unit -> string - override Equals : obj -> bool - interface System.IComparable - member ToString : format:string -> string - member ToString : format:string * provider:System.IFormatProvider -> string + (* + override ToString : unit -> string + override Equals : obj -> bool + interface System.IComparable + member ToString : format:string -> string + member ToString : format:string * provider:System.IFormatProvider -> string + *) /// The type of complex numbers type complex = Complex