diff --git a/MathNet.Numerics.sln.DotSettings b/MathNet.Numerics.sln.DotSettings
index 1cf7b657..75f0e0a2 100644
--- a/MathNet.Numerics.sln.DotSettings
+++ b/MathNet.Numerics.sln.DotSettings
@@ -11,5 +11,7 @@
FalseFalseTrue
+ False
+ FalseTrueFalse
\ No newline at end of file
diff --git a/src/FSharpUnitTests/SparseMatrixTests.fs b/src/FSharpUnitTests/SparseMatrixTests.fs
index c572a26e..0ebfc195 100644
--- a/src/FSharpUnitTests/SparseMatrixTests.fs
+++ b/src/FSharpUnitTests/SparseMatrixTests.fs
@@ -12,16 +12,17 @@ module SparseMatrixTests =
let smallM = DenseMatrix.init 4 4 (fun i j -> if i = 1 && j = 2 then 1.0 else 0.0) :> Matrix
[]
- let ``SparseMatrix.ofList`` () =
+ let ``SparseMatrix.ofList`` () =
(SparseMatrix.ofList 4 4 [(1,2,1.0)] :> Matrix) |> should equal smallM
[]
- let ``SparseMatrix.ofSeq`` () =
+ let ``SparseMatrix.ofSeq`` () =
(SparseMatrix.ofSeq 4 4 (Seq.ofList [(1,2,1.0)]) :> Matrix) |> should equal smallM
[]
- let ``SparseMatrix.constDiag`` () =
+ let ``SparseMatrix.constDiag`` () =
SparseMatrix.constDiag 100 2.0 |> should equal (2.0 * (SparseMatrix.Identity 100))
- [] let ``SparseMatrix.diag`` () =
+ []
+ let ``SparseMatrix.diag`` () =
SparseMatrix.diag (new DenseVector(100, 2.0)) |> should equal (2.0 * (SparseMatrix.Identity 100))
diff --git a/src/Numerics/Complex32.cs b/src/Numerics/Complex32.cs
index 85a94285..97b73042 100644
--- a/src/Numerics/Complex32.cs
+++ b/src/Numerics/Complex32.cs
@@ -28,18 +28,19 @@
// OTHER DEALINGS IN THE SOFTWARE.
//
+
namespace MathNet.Numerics
{
using System;
using System.Collections.Generic;
+ using System.Globalization;
using System.Numerics;
using System.Runtime;
using System.Runtime.InteropServices;
- using System.Text;
using Properties;
///
- /// 32-bit Complex32 numbers class.
+ /// 32-bit single precision complex numbers class.
///
///
///
@@ -49,18 +50,12 @@ namespace MathNet.Numerics
/// canonical way. Additional complex trigonometric functions
/// are also provided. Note that the Complex32 structures
/// has two special constant values and
- /// .
- ///
- ///
- /// In order to avoid possible ambiguities resulting from a
- /// Complex32(float, float) constructor, the static methods
- /// and
- /// are provided instead.
+ /// .
///
///
///
- /// Complex32 x = Complex32.FromRealImaginary(1d, 2d);
- /// Complex32 y = Complex32.FromModulusArgument(1d, Math.Pi);
+ /// Complex32 x = new Complex32(1f,2f);
+ /// Complex32 y = Complex32.FromPolarCoordinates(1f, Math.Pi);
/// Complex32 z = (x + y) / (x - y);
///
///
@@ -74,33 +69,6 @@ namespace MathNet.Numerics
[StructLayout(LayoutKind.Sequential)]
public struct Complex32 : IFormattable, IEquatable, IPrecisionSupport
{
- #region fields
-
- ///
- /// Represents imaginary unit number.
- ///
- private static readonly Complex32 _i = new Complex32(0, 1);
-
- ///
- /// Represents a infinite complex number
- ///
- private static readonly Complex32 _infinity = new Complex32(float.PositiveInfinity, float.PositiveInfinity);
-
- ///
- /// Represents not-a-number.
- ///
- private static readonly Complex32 _nan = new Complex32(float.NaN, float.NaN);
-
- ///
- /// Representing the one value.
- ///
- private static readonly Complex32 _one = new Complex32(1.0f, 0.0f);
-
- ///
- /// Representing the zero value.
- ///
- private static readonly Complex32 _zero = new Complex32(0.0f, 0.0f);
-
///
/// The real component of the complex number.
///
@@ -111,102 +79,79 @@ namespace MathNet.Numerics
///
private readonly float _imag;
- #endregion fields
-
- #region Constructor
-
///
/// Initializes a new instance of the Complex32 structure with the given real
/// and imaginary parts.
///
- ///
- /// The value for the real component.
- ///
- ///
- /// The value for the imaginary component.
- ///
-#if !PORTABLE
+ /// The value for the real component.
+ /// The value for the imaginary component.
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
public Complex32(float real, float imaginary)
{
_real = real;
_imag = imaginary;
}
- #endregion
-
- #region Properties
-
///
- /// Gets a value representing the infinity value. This field is constant.
+ /// Creates a complex number from a point's polar coordinates.
///
- /// The infinity.
- ///
- /// The semantic associated to this value is a Complex32 of
- /// infinite real and imaginary part. If you need more formal complex
- /// number handling (according to the Riemann Sphere and the extended
- /// complex plane C*, or using directed infinity) please check out the
- /// alternative Math.NET symbolics packages instead.
- ///
- /// A value representing the infinity value.
- public static Complex32 Infinity
+ /// A complex number.
+ /// The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number.
+ /// The phase, which is the angle from the line to the horizontal axis, measured in radians.
+ public static Complex32 FromPolarCoordinates(float magnitude, float phase)
{
- get
- {
- return _infinity;
- }
+ return new Complex32(magnitude * (float)Math.Cos(phase), magnitude * (float)Math.Sin(phase));
}
- ///
- /// Gets a value representing not-a-number. This field is constant.
- ///
- /// A value representing not-a-number.
- public static Complex32 NaN
+ [Obsolete("Use the public constructor instead.")]
+ public static Complex32 WithRealImaginary(float real, float imaginary)
{
- get
- {
- return _nan;
- }
+ return new Complex32(real, imaginary);
}
- ///
- /// Gets a value representing the imaginary unit number. This field is constant.
- ///
- /// A value representing the imaginary unit number.
- public static Complex32 ImaginaryOne
+ [Obsolete("Use static FromPolarCoordinates instead.")]
+ public static Complex32 WithModulusArgument(float modulus, float argument)
{
- get
+ if (modulus < 0.0f)
{
- return _i;
+ throw new ArgumentOutOfRangeException("modulus", Resources.ArgumentNotNegative);
}
+
+ return new Complex32(modulus * (float)Math.Cos(argument), modulus * (float)Math.Sin(argument));
}
///
- /// Gets a value representing the zero value. This field is constant.
+ /// Returns a new instance
+ /// with a real number equal to zero and an imaginary number equal to zero.
///
- /// A value representing the zero value.
- public static Complex32 Zero
- {
- get
- {
- return new Complex32(0.0f, 0.0f);
- }
- }
+ public static readonly Complex32 Zero = new Complex32(0.0f, 0.0f);
///
- /// Gets a value representing the 1 value. This field is constant.
+ /// Returns a new instance
+ /// with a real number equal to one and an imaginary number equal to zero.
///
- /// A value representing the 1 value.
- public static Complex32 One
- {
- get
- {
- return _one;
- }
- }
+ public static readonly Complex32 One = new Complex32(1.0f, 0.0f);
+
+ ///
+ /// Returns a new instance
+ /// with a real number equal to zero and an imaginary number equal to one.
+ ///
+ public static readonly Complex32 ImaginaryOne = new Complex32(0, 1);
+
+ ///
+ /// Returns a new instance
+ /// with real and imaginary numbers positive infinite.
+ ///
+ public static readonly Complex32 PositiveInfinity = new Complex32(float.PositiveInfinity, float.PositiveInfinity);
+
+ [Obsolete("Use PositiveInfinity instead")]
+ public static readonly Complex32 Infinity = PositiveInfinity;
- #endregion Properties
+ ///
+ /// Returns a new instance
+ /// with real and imaginary numbers not a number.
+ ///
+ public static readonly Complex32 NaN = new Complex32(float.NaN, float.NaN);
///
/// Gets the real component of the complex number.
@@ -214,13 +159,8 @@ namespace MathNet.Numerics
/// The real component of the complex number.
public float Real
{
-#if !PORTABLE
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- get
- {
- return _real;
- }
+ get { return _real; }
}
///
@@ -229,12 +169,80 @@ namespace MathNet.Numerics
/// The real imaginary component of the complex number.
public float Imaginary
{
-#if !PORTABLE
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- get
+ get { return _imag; }
+ }
+
+ ///
+ /// Gets the phase or argument of this Complex32.
+ ///
+ ///
+ /// Phase always returns a value bigger than negative Pi and
+ /// smaller or equal to Pi. If this Complex32 is zero, the Complex32
+ /// is assumed to be positive real with an argument of zero.
+ ///
+ /// The phase or argument of this Complex32
+ public float Phase
+ {
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ get { return (float)Math.Atan2(_imag, _real); }
+ }
+
+ ///
+ /// Gets the magnitude (or absolute value) of a complex number.
+ ///
+ /// The magnitude of the current instance.
+ public float Magnitude
+ {
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ get { return (float)Math.Sqrt((_real * _real) + (_imag * _imag)); }
+ }
+
+ ///
+ /// Gets the squared magnitude (or squared absolute value) of a complex number.
+ ///
+ /// The squared magnitude of the current instance.
+ public float MagnitudeSquared
+ {
+ get { return (_real * _real) + (_imag * _imag); }
+ }
+
+ ///
+ /// Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg))
+ ///
+ /// The unity of this Complex32.
+ public Complex32 Sign
+ {
+ get
{
- return _imag;
+ if (float.IsPositiveInfinity(_real) && float.IsPositiveInfinity(_imag))
+ {
+ return new Complex32((float)Constants.Sqrt1Over2, (float)Constants.Sqrt1Over2);
+ }
+
+ if (float.IsPositiveInfinity(_real) && float.IsNegativeInfinity(_imag))
+ {
+ return new Complex32((float)Constants.Sqrt1Over2, -(float)Constants.Sqrt1Over2);
+ }
+
+ if (float.IsNegativeInfinity(_real) && float.IsPositiveInfinity(_imag))
+ {
+ return new Complex32(-(float)Constants.Sqrt1Over2, -(float)Constants.Sqrt1Over2);
+ }
+
+ if (float.IsNegativeInfinity(_real) && float.IsNegativeInfinity(_imag))
+ {
+ return new Complex32(-(float)Constants.Sqrt1Over2, (float)Constants.Sqrt1Over2);
+ }
+
+ // don't replace this with "Magnitude"!
+ var mod = SpecialFunctions.Hypotenuse(_real, _imag);
+ if (mod == 0.0f)
+ {
+ return Zero;
+ }
+
+ return new Complex32(_real / mod, _imag / mod);
}
}
@@ -314,115 +322,6 @@ namespace MathNet.Numerics
return _imag == 0.0f && _real >= 0;
}
- ///
- /// Gets the conjugate of this Complex32.
- ///
- ///
- /// The semantic of setting the conjugate is such that
- ///
- /// // a, b of type Complex32
- /// a.Conjugate = b;
- ///
- /// is equivalent to
- ///
- /// // a, b of type Complex32
- /// a = b.Conjugate
- ///
- ///
- /// The conjugate of this Complex32
- public Complex32 Conjugate()
- {
- return new Complex32(_real, -_imag);
- }
-
- ///
- /// Gets the magnitude or modulus of this Complex32.
- ///
- /// The magnitude or modulus of this Complex32
- ///
- public float Magnitude
- {
- get
- {
- return (float)Math.Sqrt((_real * _real) + (_imag * _imag));
- }
- }
-
- ///
- /// Gets the squared magnitude of this Complex32.
- ///
- /// The squared magnitude of this Complex32
- public float MagnitudeSquared
- {
- get
- {
- return (_real * _real) + (_imag * _imag);
- }
- }
-
- ///
- /// Gets the phase or argument of this Complex32.
- ///
- ///
- /// Phase always returns a value bigger than negative Pi and
- /// smaller or equal to Pi. If this Complex32 is zero, the Complex32
- /// is assumed to be positive real with an argument of zero.
- ///
- /// The phase or argument of this Complex32
- public float Phase
- {
- get
- {
- if (IsReal() && _real < 0)
- {
- return (float)Math.PI;
- }
-
- return IsRealNonNegative() ? 0.0f : (float)Math.Atan2(_imag, _real);
- }
- }
-
- ///
- /// Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg))
- ///
- /// The unity of this Complex32.
- public Complex32 Sign
- {
- get
- {
- if (float.IsPositiveInfinity(_real) && float.IsPositiveInfinity(_imag))
- {
- return new Complex32((float)Constants.Sqrt1Over2, (float)Constants.Sqrt1Over2);
- }
-
- if (float.IsPositiveInfinity(_real) && float.IsNegativeInfinity(_imag))
- {
- return new Complex32((float)Constants.Sqrt1Over2, -(float)Constants.Sqrt1Over2);
- }
-
- if (float.IsNegativeInfinity(_real) && float.IsPositiveInfinity(_imag))
- {
- return new Complex32(-(float)Constants.Sqrt1Over2, -(float)Constants.Sqrt1Over2);
- }
-
- if (float.IsNegativeInfinity(_real) && float.IsNegativeInfinity(_imag))
- {
- return new Complex32(-(float)Constants.Sqrt1Over2, (float)Constants.Sqrt1Over2);
- }
-
- // don't replace this with "Magnitude"!
- var mod = SpecialFunctions.Hypotenuse(_real, _imag);
- if (mod == 0.0f)
- {
- return Zero;
- }
-
- return new Complex32(_real / mod, _imag / mod);
- }
- }
-
- #region Exponential Functions
-
///
/// Exponential of this Complex32 (exp(x), E^x).
///
@@ -437,15 +336,13 @@ namespace MathNet.Numerics
return new Complex32(exp, 0.0f);
}
- return new Complex32(exp * (float)Trig.Cosine(_imag), exp * (float)Trig.Sine(_imag));
+ return new Complex32(exp * (float)Math.Cos(_imag), exp * (float)Math.Sin(_imag));
}
///
/// Natural Logarithm of this Complex32 (Base E).
///
- ///
- /// The natural logarithm of this complex number.
- ///
+ /// The natural logarithm of this complex number.
public Complex32 NaturalLogarithm()
{
if (IsRealNonNegative())
@@ -456,6 +353,24 @@ namespace MathNet.Numerics
return new Complex32(0.5f * (float)Math.Log(MagnitudeSquared), Phase);
}
+ ///
+ /// Common Logarithm of this Complex32 (Base 10).
+ ///
+ /// The common logarithm of this complex number.
+ public Complex32 CommonLogarithm()
+ {
+ return NaturalLogarithm() / (float)Constants.Ln10;
+ }
+
+ ///
+ /// Logarithm of this Complex32 with custom base.
+ ///
+ /// The logarithm of this complex number.
+ public Complex32 Logarithm(float baseValue)
+ {
+ return NaturalLogarithm() / (float)Math.Log(baseValue);
+ }
+
///
/// Raise this Complex32 to the given value.
///
@@ -474,19 +389,16 @@ namespace MathNet.Numerics
return One;
}
- if (exponent.Real > 0.0f)
+ if (exponent.Real > 0f)
{
return Zero;
}
- if (exponent.Real < 0)
+ if (exponent.Real < 0f)
{
- if (exponent.Imaginary == 0.0f)
- {
- return new Complex32(float.PositiveInfinity, 0.0f);
- }
-
- return new Complex32(float.PositiveInfinity, float.PositiveInfinity);
+ return exponent.Imaginary == 0f
+ ? new Complex32(float.PositiveInfinity, 0f)
+ : new Complex32(float.PositiveInfinity, float.PositiveInfinity);
}
return NaN;
@@ -564,192 +476,11 @@ namespace MathNet.Numerics
}
else
{
- result = new Complex32((float)(absImag / (2.0 * w)), (float)-w);
- }
-
- return result;
- }
-
- #endregion
-
- #region Static Initializers
-
- ///
- /// Constructs a Complex32 from its real
- /// and imaginary parts.
- ///
- ///
- /// The value for the real component.
- ///
- ///
- /// The value for the imaginary component.
- ///
- ///
- /// A new Complex32 with the given values.
- ///
- public static Complex32 WithRealImaginary(float real, float imaginary)
- {
- return new Complex32(real, imaginary);
- }
-
- ///
- /// Constructs a Complex32 from its modulus and
- /// argument.
- ///
- ///
- /// Must be non-negative.
- ///
- ///
- /// Real number.
- ///
- ///
- /// A new Complex32 from the given values.
- ///
- public static Complex32 WithModulusArgument(float modulus, float argument)
- {
- if (modulus < 0.0f)
- {
- throw new ArgumentOutOfRangeException("modulus", Resources.ArgumentNotNegative);
- }
-
- return new Complex32(modulus * (float)Math.Cos(argument), modulus * (float)Math.Sin(argument));
- }
-
- #endregion
-
- #region IFormattable Members
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number.
- ///
- public override string ToString()
- {
- return ToString(null, null);
- }
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number formatted as specified by the
- /// format string.
- ///
- ///
- /// A format specification.
- ///
- public string ToString(string format)
- {
- return ToString(format, null);
- }
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number formatted as specified by the
- /// format provider.
- ///
- ///
- /// An that supplies culture-specific formatting information.
- ///
- public string ToString(IFormatProvider formatProvider)
- {
- return ToString(null, formatProvider);
- }
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number formatted as specified by the
- /// format string and format provider.
- ///
- ///
- /// if the n, is not a number.
- ///
- ///
- /// if s, is .
- ///
- ///
- /// A format specification.
- ///
- ///
- /// An that supplies culture-specific formatting information.
- ///
- public string ToString(string format, IFormatProvider formatProvider)
- {
- var ret = new StringBuilder();
- ret.Append("(").Append(_real.ToString(format, formatProvider)).Append(", ").Append(_imag.ToString(format, formatProvider)).Append(")");
- return ret.ToString();
- }
-
- #endregion
-
- #region IEquatable Members
-
- ///
- /// Checks if two complex numbers are equal. Two complex numbers are equal if their
- /// corresponding real and imaginary components are equal.
- ///
- ///
- /// Returns true if the two objects are the same object, or if their corresponding
- /// real and imaginary components are equal, false otherwise.
- ///
- ///
- /// The complex number to compare to with.
- ///
- public bool Equals(Complex32 other)
- {
- if (IsNaN() || other.IsNaN())
- {
- return false;
- }
-
- if (IsInfinity() && other.IsInfinity())
- {
- return true;
- }
-
- return _real.AlmostEqual(other._real) && _imag.AlmostEqual(other._imag);
- }
-
- ///
- /// The hash code for the complex number.
- ///
- ///
- /// The hash code of the complex number.
- ///
- ///
- /// The hash code is calculated as
- /// System.Math.Exp(ComplexMath.Absolute(complexNumber)).
- ///
- public override int GetHashCode()
- {
- return _real.GetHashCode() ^ (-_imag.GetHashCode());
- }
-
- ///
- /// Checks if two complex numbers are equal. Two complex numbers are equal if their
- /// corresponding real and imaginary components are equal.
- ///
- ///
- /// Returns true if the two objects are the same object, or if their corresponding
- /// real and imaginary components are equal, false otherwise.
- ///
- ///
- /// The complex number to compare to with.
- ///
- public override bool Equals(object obj)
- {
- return (obj is Complex32) && Equals((Complex32)obj);
- }
-
- #endregion
+ result = new Complex32((float)(absImag / (2.0 * w)), (float)-w);
+ }
- #region Operators
+ return result;
+ }
///
/// Equality test.
@@ -854,7 +585,7 @@ namespace MathNet.Numerics
public static Complex32 operator *(Complex32 multiplicand, Complex32 multiplier)
{
return new Complex32(
- (multiplicand._real * multiplier._real) - (multiplicand._imag * multiplier._imag),
+ (multiplicand._real * multiplier._real) - (multiplicand._imag * multiplier._imag),
(multiplicand._real * multiplier._imag) + (multiplicand._imag * multiplier._real));
}
@@ -889,12 +620,12 @@ namespace MathNet.Numerics
if (divisor.IsZero())
{
- return Infinity;
+ return PositiveInfinity;
}
var modSquared = divisor.MagnitudeSquared;
return new Complex32(
- ((dividend._real * divisor._real) + (dividend._imag * divisor._imag)) / modSquared,
+ ((dividend._real * divisor._real) + (dividend._imag * divisor._imag)) / modSquared,
((dividend._imag * divisor._real) - (dividend._real * divisor._imag)) / modSquared);
}
@@ -911,7 +642,7 @@ namespace MathNet.Numerics
if (divisor.IsZero())
{
- return Infinity;
+ return PositiveInfinity;
}
var zmod = divisor.MagnitudeSquared;
@@ -931,106 +662,182 @@ namespace MathNet.Numerics
if (divisor == 0.0f)
{
- return Infinity;
+ return PositiveInfinity;
}
return new Complex32(dividend._real / divisor, dividend._imag / divisor);
}
- ///
- /// Unary addition.
- ///
- ///
- /// Returns the same complex number.
- ///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
+ [Obsolete("No Operation")]
public Complex32 Plus()
{
return this;
}
- ///
- /// Unary minus.
- ///
- ///
- /// The negated value of this complex number.
- ///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
+ [Obsolete("Use static Complex32.Negate or the unary - operator instead.")]
public Complex32 Negate()
{
return -this;
}
///
- /// Adds a complex number to this one.
+ /// Computes the conjugate of a complex number and returns the result.
///
- ///
- /// The result of the addition.
- ///
- ///
- /// The other complex number to add.
- ///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
+ public Complex32 Conjugate()
+ {
+ return new Complex32(_real, -_imag);
+ }
+
+ ///
+ /// Returns the multiplicative inverse of a complex number.
+ ///
+ public Complex32 Reciprocal()
+ {
+ if (IsZero())
+ {
+ return Zero;
+ }
+
+ return 1.0f / this;
+ }
+
+ [Obsolete("Use static Complex32.Add or the + operator instead.")]
public Complex32 Add(Complex32 other)
{
return this + other;
}
+ [Obsolete("Use static Complex32.Subtract or the - operator instead.")]
+ public Complex32 Subtract(Complex32 other)
+ {
+ return this - other;
+ }
+
+ [Obsolete("Use static Complex32.Multiply or the * operator instead.")]
+ public Complex32 Multiply(Complex32 multiplier)
+ {
+ return this * multiplier;
+ }
+
+ [Obsolete("Use static Complex32.Divide or the / operator instead.")]
+ public Complex32 Divide(Complex32 divisor)
+ {
+ return this / divisor;
+ }
+
+ #region IFormattable Members
+
+ ///
+ /// Converts the value of the current complex number to its equivalent string representation in Cartesian form.
+ ///
+ /// The string representation of the current instance in Cartesian form.
+ public override string ToString()
+ {
+ return string.Format(CultureInfo.CurrentCulture, "({0}, {1})", _real, _imag);
+ }
+
+ ///
+ /// Converts the value of the current complex number to its equivalent string representation
+ /// in Cartesian form by using the specified format for its real and imaginary parts.
+ ///
+ /// The string representation of the current instance in Cartesian form.
+ /// A standard or custom numeric format string.
+ ///
+ /// is not a valid format string.
+ public string ToString(string format)
+ {
+ return string.Format(CultureInfo.CurrentCulture, "({0}, {1})",
+ _real.ToString(format, CultureInfo.CurrentCulture),
+ _imag.ToString(format, CultureInfo.CurrentCulture));
+ }
+
+ ///
+ /// Converts the value of the current complex number to its equivalent string representation
+ /// in Cartesian form by using the specified culture-specific formatting information.
+ ///
+ /// The string representation of the current instance in Cartesian form, as specified by .
+ /// An object that supplies culture-specific formatting information.
+ public string ToString(IFormatProvider provider)
+ {
+ return string.Format(provider, "({0}, {1})", _real, _imag);
+ }
+
+ /// Converts the value of the current complex number to its equivalent string representation
+ /// in Cartesian form by using the specified format and culture-specific format information for its real and imaginary parts.
+ /// The string representation of the current instance in Cartesian form, as specified by and .
+ /// A standard or custom numeric format string.
+ /// An object that supplies culture-specific formatting information.
+ ///
+ /// is not a valid format string.
+ public string ToString(string format, IFormatProvider provider)
+ {
+ return string.Format(provider, "({0}, {1})",
+ _real.ToString(format, provider),
+ _imag.ToString(format, provider));
+ }
+
+ #endregion
+
+ #region IEquatable Members
+
///
- /// Subtracts a complex number from this one.
+ /// Checks if two complex numbers are equal. Two complex numbers are equal if their
+ /// corresponding real and imaginary components are equal.
///
///
- /// The result of the subtraction.
+ /// Returns true if the two objects are the same object, or if their corresponding
+ /// real and imaginary components are equal, false otherwise.
///
///
- /// The other complex number to subtract from this one.
+ /// The complex number to compare to with.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex32 Subtract(Complex32 other)
+ public bool Equals(Complex32 other)
{
- return this - other;
+ if (IsNaN() || other.IsNaN())
+ {
+ return false;
+ }
+
+ if (IsInfinity() && other.IsInfinity())
+ {
+ return true;
+ }
+
+ return _real.AlmostEqual(other._real) && _imag.AlmostEqual(other._imag);
}
///
- /// Multiplies this complex number with this one.
+ /// The hash code for the complex number.
///
///
- /// The result of the multiplication.
+ /// The hash code of the complex number.
///
- ///
- /// The complex number to multiply.
- ///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex32 Multiply(Complex32 multiplier)
+ ///
+ /// The hash code is calculated as
+ /// System.Math.Exp(ComplexMath.Absolute(complexNumber)).
+ ///
+ public override int GetHashCode()
{
- return this * multiplier;
+ int hash = 27;
+ hash = (13 * hash) + _real.GetHashCode();
+ hash = (13 * hash) + _imag.GetHashCode();
+ return hash;
}
///
- /// Divides this complex number by another.
+ /// Checks if two complex numbers are equal. Two complex numbers are equal if their
+ /// corresponding real and imaginary components are equal.
///
///
- /// The result of the division.
+ /// Returns true if the two objects are the same object, or if their corresponding
+ /// real and imaginary components are equal, false otherwise.
///
- ///
- /// The divisor.
+ ///
+ /// The complex number to compare to with.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex32 Divide(Complex32 divisor)
+ public override bool Equals(object obj)
{
- return this / divisor;
+ return (obj is Complex32) && Equals((Complex32)obj);
}
#endregion
@@ -1304,12 +1111,12 @@ namespace MathNet.Numerics
}
catch (ArgumentNullException)
{
- result = _zero;
+ result = Zero;
ret = false;
}
catch (FormatException)
{
- result = _zero;
+ result = Zero;
ret = false;
}
@@ -1468,243 +1275,265 @@ namespace MathNet.Numerics
#endregion
///
- /// Gets the absolute value (or magnitude) of a complex number.
+ /// Returns the additive inverse of a specified complex number.
///
+ /// The result of the and components of the parameter multiplied by -1.
/// A complex number.
- /// The absolute value (or magnitude) of a complex number.
- public static double Abs(Complex32 value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Negate(Complex32 value)
{
- return value.Magnitude;
+ return -value;
}
///
- /// Trigonometric Arc Cosine of a Complex number.
+ /// Computes the conjugate of a complex number and returns the result.
///
+ /// The conjugate of .
/// A complex number.
- ///
- /// The arc cosine of a complex number.
- ///
- public static Complex32 Acos(Complex32 value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Conjugate(Complex32 value)
{
- return (Complex32)value.ToComplex().InverseCosine();
+ return value.Conjugate();
}
///
- /// Trigonometric Arc Sine of a Complex number.
+ /// Adds two complex numbers and returns the result.
///
- /// A complex number.
- ///
- /// The arc sine of a complex number.
- ///
- public static Complex32 Asin(Complex32 value)
+ /// The sum of and .
+ /// The first complex number to add.
+ /// The second complex number to add.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Add(Complex32 left, Complex32 right)
{
- return (Complex32)value.ToComplex().InverseSine();
+ return left + right;
}
///
- /// Trigonometric Arc Tangent of a Complex number.
+ /// Subtracts one complex number from another and returns the result.
///
- /// A complex number.
- ///
- /// The arc tangent of a complex number.
- ///
- public static Complex32 Atan(Complex32 value)
+ /// The result of subtracting from .
+ /// The value to subtract from (the minuend).
+ /// The value to subtract (the subtrahend).
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Subtract(Complex32 left, Complex32 right)
{
- return (Complex32)value.ToComplex().InverseTangent();
+ return left - right;
}
///
- /// Trigonometric Cosine of a Complex number.
+ /// Returns the product of two complex numbers.
///
- /// A complex number.
- ///
- /// The cosine of a complex number.
- ///
- public static Complex32 Cos(Complex32 value)
+ /// The product of the and parameters.
+ /// The first complex number to multiply.
+ /// The second complex number to multiply.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Multiply(Complex32 left, Complex32 right)
{
- return (Complex32)value.ToComplex().Cosine();
+ return left * right;
}
///
- /// Trigonometric Sine of a Complex number.
+ /// Divides one complex number by another and returns the result.
///
- /// A complex number.
- ///
- /// The Sine of a complex number.
- ///
- public static Complex32 Sin(Complex32 value)
+ /// The quotient of the division.
+ /// The complex number to be divided.
+ /// The complex number to divide by.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Divide(Complex32 dividend, Complex32 divisor)
{
- return (Complex32)value.ToComplex().Sine();
+ return dividend / divisor;
}
///
- /// Trigonometric Tangent of a Complex number.
+ /// Returns the multiplicative inverse of a complex number.
///
+ /// The reciprocal of .
/// A complex number.
- ///
- /// The tangent of a complex number.
- ///
- public static Complex32 Tan(Complex32 value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Reciprocal(Complex32 value)
{
- return (Complex32)value.ToComplex().Tangent();
+ return value.Reciprocal();
}
///
- /// Trigonometric Hyperbolic Cosine of a Complex number.
+ /// Returns the square root of a specified complex number.
///
+ /// The square root of .
/// A complex number.
- ///
- /// The hyperbolic cosine of a complex number.
- ///
- public static Complex32 Cosh(Complex32 value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Sqrt(Complex32 value)
{
- return (Complex32)value.ToComplex().HyperbolicCosine();
+ return value.SquareRoot();
}
///
- /// Trigonometric Hyperbolic Sine of a Complex number.
+ /// Gets the absolute value (or magnitude) of a complex number.
///
+ /// The absolute value of .
/// A complex number.
- ///
- /// The hyperbolic sine of a complex number.
- ///
- public static Complex32 Sinh(Complex32 value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static double Abs(Complex32 value)
{
- return (Complex32)value.ToComplex().HyperbolicSine();
+ return value.Magnitude;
}
///
- /// Trigonometric Hyperbolic Tangent of a Complex number.
+ /// Returns e raised to the power specified by a complex number.
///
- /// A complex number.
- ///
- /// The hyperbolic tangent of a complex number.
- ///
- public static Complex32 Tanh(Complex32 value)
+ /// The number e raised to the power .
+ /// A complex number that specifies a power.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Exp(Complex32 value)
{
- return (Complex32)value.ToComplex().HyperbolicTangent();
+ return value.Exponential();
}
///
- /// Exponential of a Complex number (exp(x), E^x).
+ /// Returns a specified complex number raised to a power specified by a complex number.
///
- /// A complex number.
- ///
- /// The exponential of a complex number.
- ///
- public static Complex32 Exp(Complex32 value)
+ /// The complex number raised to the power .
+ /// A complex number to be raised to a power.
+ /// A complex number that specifies a power.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Pow(Complex32 value, Complex32 power)
{
- return (Complex32)value.ToComplex().Exponential();
+ return value.Power(power);
}
///
- /// Constructs a Complex from its magnitude and phase.
+ /// Returns a specified complex number raised to a power specified by a single-precision floating-point number.
///
- ///
- /// Must be non-negative.
- ///
- ///
- /// Real number.
- ///
- ///
- /// A new Complex from the given values.
- ///
- ///
- public static Complex32 FromPolarCoordinates(float magnitude, float phase)
+ /// The complex number raised to the power .
+ /// A complex number to be raised to a power.
+ /// A single-precision floating-point number that specifies a power.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex32 Pow(Complex32 value, float power)
{
- return WithModulusArgument(magnitude, phase);
+ return value.Power(power);
}
///
- /// Natural Logarithm of a Complex number (exp(x), E^x).
+ /// Returns the natural (base e) logarithm of a specified complex number.
///
+ /// The natural (base e) logarithm of .
/// A complex number.
- ///
- /// The natural logarithm of a complex number.
- ///
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex32 Log(Complex32 value)
{
- return (Complex32)value.ToComplex().NaturalLogarithm();
+ return value.NaturalLogarithm();
}
///
- /// Returns the logarithm of a specified complex number in a specified base
+ /// Returns the logarithm of a specified complex number in a specified base.
///
+ /// The logarithm of in base .
/// A complex number.
/// The base of the logarithm.
- /// The logarithm of value in base baseValue.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex32 Log(Complex32 value, float baseValue)
{
- if (baseValue == 1.0)
- {
- return float.NaN;
- }
-
- return (Complex32)(value.ToComplex().NaturalLogarithm() / Math.Log(baseValue, Math.E));
+ return value.Logarithm(baseValue);
}
///
- /// Returns the base-10 logarithm of a specified complex number in a specified base
+ /// Returns the base-10 logarithm of a specified complex number.
///
+ /// The base-10 logarithm of .
/// A complex number.
- /// The base-10 logarithm of the complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex32 Log10(Complex32 value)
{
- return Log(value, 10);
+ return value.CommonLogarithm();
}
///
- /// Raise this a Complexnumber to the given value.
+ /// Returns the sine of the specified complex number.
///
+ /// The sine of .
/// A complex number.
- /// The exponent.
- ///
- /// The complex number raised to the given exponent.
- ///
- public static Complex32 Pow(Complex32 value, Complex32 power)
+ public static Complex32 Sin(Complex32 value)
{
- return value.Power(power);
+ return (Complex32)Trig.Sine(value.ToComplex());
}
///
- /// Raise this a Complexnumber to the given value.
+ /// Returns the cosine of the specified complex number.
///
+ /// The cosine of .
/// A complex number.
- /// The exponent.
- ///
- /// The complex number raised to the given exponent.
- ///
- public static Complex32 Pow(Complex32 value, float power)
+ public static Complex32 Cos(Complex32 value)
{
- return value.Power(power);
+ return (Complex32)Trig.Cosine(value.ToComplex());
}
///
- /// Returns the multiplicative inverse of a complex number.
+ /// Returns the tangent of the specified complex number.
///
+ /// The tangent of .
/// A complex number.
- /// The reciprocal of value.
- /// If value is , the method returns . Otherwise, it returns the result of the expression / value.
- public static Complex32 Reciprocal(Complex32 value)
+ public static Complex32 Tan(Complex32 value)
{
- if (value.IsZero())
- {
- return _zero;
- }
+ return (Complex32)Trig.Tangent(value.ToComplex());
+ }
+
+ ///
+ /// Returns the angle that is the arc sine of the specified complex number.
+ ///
+ /// The angle which is the arc sine of .
+ /// A complex number.
+ public static Complex32 Asin(Complex32 value)
+ {
+ return (Complex32)Trig.InverseSine(value.ToComplex());
+ }
- return 1.0f / value;
+ ///
+ /// Returns the angle that is the arc cosine of the specified complex number.
+ ///
+ /// The angle, measured in radians, which is the arc cosine of .
+ /// A complex number that represents a cosine.
+ public static Complex32 Acos(Complex32 value)
+ {
+ return (Complex32)Trig.InverseCosine(value.ToComplex());
}
///
- /// The Square Root (power 1/2) of a Complex number.
+ /// Returns the angle that is the arc tangent of the specified complex number.
///
+ /// The angle that is the arc tangent of .
/// A complex number.
- ///
- /// The square root of a complex number.
- ///
- public static Complex32 Sqrt(Complex32 value)
+ public static Complex32 Atan(Complex32 value)
{
- return value.SquareRoot();
+ return (Complex32)Trig.InverseTangent(value.ToComplex());
+ }
+
+ ///
+ /// Returns the hyperbolic sine of the specified complex number.
+ ///
+ /// The hyperbolic sine of .
+ /// A complex number.
+ public static Complex32 Sinh(Complex32 value)
+ {
+ return (Complex32)Trig.HyperbolicSine(value.ToComplex());
+ }
+
+ ///
+ /// Returns the hyperbolic cosine of the specified complex number.
+ ///
+ /// The hyperbolic cosine of .
+ /// A complex number.
+ public static Complex32 Cosh(Complex32 value)
+ {
+ return (Complex32)Trig.HyperbolicCosine(value.ToComplex());
+ }
+
+ ///
+ /// Returns the hyperbolic tangent of the specified complex number.
+ ///
+ /// The hyperbolic tangent of .
+ /// A complex number.
+ public static Complex32 Tanh(Complex32 value)
+ {
+ return (Complex32)Trig.HyperbolicTangent(value.ToComplex());
}
}
}
\ No newline at end of file
diff --git a/src/Numerics/Complex64.cs b/src/Numerics/Complex64.cs
index ec16c13f..14f4f2c4 100644
--- a/src/Numerics/Complex64.cs
+++ b/src/Numerics/Complex64.cs
@@ -29,19 +29,21 @@
//
#if !SYSNUMERICS
-using MathNet.Numerics;
-
namespace System.Numerics
{
-
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
+ using MathNet.Numerics;
using MathNet.Numerics.Properties;
+#if !PORTABLE
+ using System.Runtime;
+#endif
+
///
- /// 64-bit Complex numbers class.
+ /// 64-bit double precision complex numbers class.
///
///
///
@@ -51,18 +53,12 @@ namespace System.Numerics
/// canonical way. Additional complex trigonometric functions
/// are also provided. Note that the Complex structures
/// has two special constant values and
- /// .
- ///
- ///
- /// In order to avoid possible ambiguities resulting from a
- /// Complex(double, double) constructor, the static methods
- /// and
- /// are provided instead.
+ /// .
///
///
///
- /// Complex x = Complex.FromRealImaginary(1d, 2d);
- /// Complex y = Complex.FromModulusArgument(1d, Math.Pi);
+ /// Complex x = new Complex(1d, 2d);
+ /// Complex y = Complex.FromPolarCoordinates(1d, Math.Pi);
/// Complex z = (x + y) / (x - y);
///
///
@@ -76,33 +72,6 @@ namespace System.Numerics
[StructLayout(LayoutKind.Sequential)]
public struct Complex : IFormattable, IEquatable, IPrecisionSupport
{
- #region fields
-
- ///
- /// Represents imaginary unit number.
- ///
- private static readonly Complex _i = new Complex(0, 1);
-
- ///
- /// Represents a infinite complex number
- ///
- private static readonly Complex _infinity = new Complex(double.PositiveInfinity, double.PositiveInfinity);
-
- ///
- /// Represents not-a-number.
- ///
- private static readonly Complex _nan = new Complex(double.NaN, double.NaN);
-
- ///
- /// Representing the one value.
- ///
- private static readonly Complex _one = new Complex(1.0f, 0.0d);
-
- ///
- /// Representing the zero value.
- ///
- private static readonly Complex _zero = new Complex(0.0d, 0.0d);
-
///
/// The real component of the complex number.
///
@@ -113,253 +82,98 @@ namespace System.Numerics
///
private readonly double _imag;
- #endregion fields
-
- #region Constructor
-
///
/// Initializes a new instance of the Complex structure with the given real
/// and imaginary parts.
///
- ///
- /// The value for the real component.
- ///
- ///
- /// The value for the imaginary component.
- ///
-#if !PORTABLE
+ /// The value for the real component.
+ /// The value for the imaginary component.
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
public Complex(double real, double imaginary)
{
_real = real;
_imag = imaginary;
}
- #endregion
-
- #region Properties
-
///
- /// Gets a value representing the infinity value. This field is constant.
+ /// Creates a complex number from a point's polar coordinates.
///
- /// The infinity.
- ///
- /// The semantic associated to this value is a Complex of
- /// infinite real and imaginary part. If you need more formal complex
- /// number handling (according to the Riemann Sphere and the extended
- /// complex plane C*, or using directed infinity) please check out the
- /// alternative Math.NET symbolics packages instead.
- ///
- /// A value representing the infinity value.
- public static Complex Infinity
- {
- get
- {
- return _infinity;
- }
- }
-
- ///
- /// Gets a value representing not-a-number. This field is constant.
- ///
- /// A value representing not-a-number.
- public static Complex NaN
- {
- get
- {
- return _nan;
- }
- }
-
- ///
- /// Gets a value representing the imaginary unit number. This field is constant.
- ///
- /// A value representing the imaginary unit number.
- public static Complex ImaginaryOne
- {
- get
- {
- return _i;
- }
- }
-
- ///
- /// Gets a value representing the zero value. This field is constant.
- ///
- /// A value representing the zero value.
- public static Complex Zero
+ /// A complex number.
+ /// The magnitude, which is the distance from the origin (the intersection of the x-axis and the y-axis) to the number.
+ /// The phase, which is the angle from the line to the horizontal axis, measured in radians.
+ public static Complex FromPolarCoordinates(double magnitude, double phase)
{
- get
- {
- return new Complex(0.0d, 0.0d);
- }
+ return new Complex(magnitude * Math.Cos(phase), magnitude * Math.Sin(phase));
}
- ///
- /// Gets a value representing the 1 value. This field is constant.
- ///
- /// A value representing the 1 value.
- public static Complex One
+ [Obsolete("Use the public constructor instead.")]
+ public static Complex WithRealImaginary(double real, double imaginary)
{
- get
- {
- return _one;
- }
+ return new Complex(real, imaginary);
}
- #endregion Properties
-
- ///
- /// Gets the real component of the complex number.
- ///
- /// The real component of the complex number.
- public double Real
+ [Obsolete("Use static FromPolarCoordinates instead.")]
+ public static Complex WithModulusArgument(double modulus, double argument)
{
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- get
+ if (modulus < 0.0d)
{
- return _real;
+ throw new ArgumentOutOfRangeException("modulus", Resources.ArgumentNotNegative);
}
- }
- ///
- /// Gets the real imaginary component of the complex number.
- ///
- /// The real imaginary component of the complex number.
- public double Imaginary
- {
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- get
- {
- return _imag;
- }
+ return new Complex(modulus * Math.Cos(argument), modulus * Math.Sin(argument));
}
///
- /// Gets a value indicating whether the Complex is zero.
+ /// Returns a new instance
+ /// with a real number equal to zero and an imaginary number equal to zero.
///
- /// true if this instance is zero; otherwise, false.
- public bool IsZero()
- {
- return _real == 0.0d && _imag == 0.0d;
- }
+ public static readonly Complex Zero = new Complex(0.0f, 0.0f);
///
- /// Gets a value indicating whether the Complex is one.
+ /// Returns a new instance
+ /// with a real number equal to one and an imaginary number equal to zero.
///
- /// true if this instance is one; otherwise, false.
- public bool IsOne()
- {
- return _real == 1.0d && _imag == 0.0d;
- }
+ public static readonly Complex One = new Complex(1.0f, 0.0f);
///
- /// Gets a value indicating whether the Complex is the imaginary unit.
+ /// Returns a new instance
+ /// with a real number equal to zero and an imaginary number equal to one.
///
- /// true if this instance is ImaginaryOne; otherwise, false.
- public bool IsImaginaryOne()
- {
- return _real == 0.0d && _imag == 1.0d;
- }
+ public static readonly Complex ImaginaryOne = new Complex(0, 1);
///
- /// Gets a value indicating whether the provided Complexevaluates
- /// to a value that is not a number.
+ /// Returns a new instance
+ /// with real and imaginary numbers positive infinite.
///
- ///
- /// true if this instance is ; otherwise,
- /// false.
- ///
- public bool IsNaN()
- {
- return double.IsNaN(_real) || double.IsNaN(_imag);
- }
+ public static readonly Complex PositiveInfinity = new Complex(float.PositiveInfinity, float.PositiveInfinity);
- ///
- /// Gets a value indicating whether the provided Complex evaluates to an
- /// infinite value.
- ///
- ///
- /// true if this instance is infinite; otherwise, false.
- ///
- ///
- /// True if it either evaluates to a complex infinity
- /// or to a directed infinity.
- ///
- public bool IsInfinity()
- {
- return double.IsInfinity(_real) || double.IsInfinity(_imag);
- }
+ [Obsolete("Use PositiveInfinity instead")]
+ public static readonly Complex Infinity = PositiveInfinity;
///
- /// Gets a value indicating whether the provided Complex is real.
+ /// Returns a new instance
+ /// with real and imaginary numbers not a number.
///
- /// true if this instance is a real number; otherwise, false.
- public bool IsReal()
- {
- return _imag == 0.0d;
- }
+ public static readonly Complex NaN = new Complex(float.NaN, float.NaN);
///
- /// Gets a value indicating whether the provided Complex is real and not negative, that is >= 0.
- ///
- ///
- /// true if this instance is real nonnegative number; otherwise, false.
- ///
- public bool IsRealNonNegative()
- {
- return _imag == 0.0d && _real >= 0;
- }
-
- ///
- /// Gets the conjugate of this Complex.
- ///
- ///
- /// The semantic of setting the conjugate is such that
- ///
- /// // a, b of type Complex
- /// a.Conjugate = b;
- ///
- /// is equivalent to
- ///
- /// // a, b of type Complex
- /// a = b.Conjugate
- ///
- ///
- /// The conjugate of this Complex
- public Complex Conjugate()
- {
- return new Complex(_real, -_imag);
- }
-
- ///
- /// Gets the magnitude or modulus of this Complex.
+ /// Gets the real component of the complex number.
///
- /// The magnitude or modulus of this Complex
- ///
- public double Magnitude
+ /// The real component of the complex number.
+ public double Real
{
- get
- {
- return Math.Sqrt((_real * _real) + (_imag * _imag));
- }
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ get { return _real; }
}
///
- /// Gets the squared magnitude of this Complex.
+ /// Gets the real imaginary component of the complex number.
///
- /// The squared magnitude of this Complex
- public double MagnitudeSquared
+ /// The real imaginary component of the complex number.
+ public double Imaginary
{
- get
- {
- return (_real * _real) + (_imag * _imag);
- }
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ get { return _imag; }
}
///
@@ -373,386 +187,20 @@ namespace System.Numerics
/// The phase or argument of this Complex
public double Phase
{
- get
- {
- if (IsReal() && _real < 0)
- {
- return Math.PI;
- }
-
- return IsRealNonNegative() ? 0.0d : Math.Atan2(_imag, _real);
- }
- }
-
- ///
- /// Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg))
- ///
- /// The unity of this Complex.
- public Complex Sign
- {
- get
- {
- if (double.IsPositiveInfinity(_real) && double.IsPositiveInfinity(_imag))
- {
- return new Complex(Constants.Sqrt1Over2, Constants.Sqrt1Over2);
- }
-
- if (double.IsPositiveInfinity(_real) && double.IsNegativeInfinity(_imag))
- {
- return new Complex(Constants.Sqrt1Over2, -Constants.Sqrt1Over2);
- }
-
- if (double.IsNegativeInfinity(_real) && double.IsPositiveInfinity(_imag))
- {
- return new Complex(-Constants.Sqrt1Over2, -Constants.Sqrt1Over2);
- }
-
- if (double.IsNegativeInfinity(_real) && double.IsNegativeInfinity(_imag))
- {
- return new Complex(-Constants.Sqrt1Over2, Constants.Sqrt1Over2);
- }
-
- // don't replace this with "Magnitude"!
- var mod = SpecialFunctions.Hypotenuse(_real, _imag);
- if (mod == 0.0d)
- {
- return Zero;
- }
-
- return new Complex(_real / mod, _imag / mod);
- }
- }
-
- #region Exponential Functions
-
- ///
- /// Exponential of this Complex (exp(x), E^x).
- ///
- ///
- /// The exponential of this complex number.
- ///
- public Complex Exponential()
- {
- var exp = Math.Exp(_real);
- if (IsReal())
- {
- return new Complex(exp, 0.0d);
- }
-
- return new Complex(exp * Trig.Cosine(_imag), exp * Trig.Sine(_imag));
- }
-
- ///
- /// Natural Logarithm of this Complex (Base E).
- ///
- ///
- /// The natural logarithm of this complex number.
- ///
- public Complex NaturalLogarithm()
- {
- if (IsRealNonNegative())
- {
- return new Complex(Math.Log(_real), 0.0d);
- }
-
- return new Complex(0.5d * Math.Log(MagnitudeSquared), Phase);
- }
-
- ///
- /// Raise this Complex to the given value.
- ///
- ///
- /// The exponent.
- ///
- ///
- /// The complex number raised to the given exponent.
- ///
- public Complex Power(Complex exponent)
- {
- if (IsZero())
- {
- if (exponent.IsZero())
- {
- return One;
- }
-
- if (exponent.Real > 0.0d)
- {
- return Zero;
- }
-
- if (exponent.Real < 0)
- {
- if (exponent.Imaginary == 0.0d)
- {
- return new Complex(double.PositiveInfinity, 0.0d);
- }
-
- return new Complex(double.PositiveInfinity, double.PositiveInfinity);
- }
-
- return NaN;
- }
-
- return (exponent * NaturalLogarithm()).Exponential();
- }
-
- ///
- /// Raise this Complex to the inverse of the given value.
- ///
- ///
- /// The root exponent.
- ///
- ///
- /// The complex raised to the inverse of the given exponent.
- ///
- public Complex Root(Complex rootExponent)
- {
- return Power(1 / rootExponent);
- }
-
- ///
- /// The Square (power 2) of this Complex
- ///
- ///
- /// The square of this complex number.
- ///
- public Complex Square()
- {
- if (IsReal())
- {
- return new Complex(_real * _real, 0.0d);
- }
-
- return new Complex((_real * _real) - (_imag * _imag), 2 * _real * _imag);
- }
-
- ///
- /// The Square Root (power 1/2) of this Complex
- ///
- ///
- /// The square root of this complex number.
- ///
- public Complex SquareRoot()
- {
- if (IsRealNonNegative())
- {
- return new Complex(Math.Sqrt(_real), 0.0d);
- }
-
- Complex result;
-
- var absReal = Math.Abs(Real);
- var absImag = Math.Abs(Imaginary);
- double w;
- if (absReal >= absImag)
- {
- var ratio = Imaginary / Real;
- w = Math.Sqrt(absReal) * Math.Sqrt(0.5 * (1.0d + Math.Sqrt(1.0d + (ratio * ratio))));
- }
- else
- {
- var ratio = Real / Imaginary;
- w = Math.Sqrt(absImag) * Math.Sqrt(0.5 * (Math.Abs(ratio) + Math.Sqrt(1.0d + (ratio * ratio))));
- }
-
- if (Real >= 0.0d)
- {
- result = new Complex(w, Imaginary / (2.0d * w));
- }
- else if (Imaginary >= 0.0d)
- {
- result = new Complex(absImag / (2.0 * w), w);
- }
- else
- {
- result = new Complex(absImag / (2.0 * w), -w);
- }
-
- return result;
- }
-
- #endregion
-
- #region Static Initializers
-
- ///
- /// Constructs a Complex from its real
- /// and imaginary parts.
- ///
- ///
- /// The value for the real component.
- ///
- ///
- /// The value for the imaginary component.
- ///
- ///
- /// A new Complex with the given values.
- ///
- public static Complex WithRealImaginary(double real, double imaginary)
- {
- return new Complex(real, imaginary);
- }
-
- ///
- /// Constructs a Complex from its modulus and
- /// argument.
- ///
- ///
- /// Must be non-negative.
- ///
- ///
- /// Real number.
- ///
- ///
- /// A new Complex from the given values.
- ///
- public static Complex WithModulusArgument(double modulus, double argument)
- {
- if (modulus < 0.0d)
- {
- throw new ArgumentOutOfRangeException("modulus", Resources.ArgumentNotNegative);
- }
-
- return new Complex(modulus * Math.Cos(argument), modulus * Math.Sin(argument));
- }
-
- #endregion
-
- #region IFormattable Members
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number.
- ///
- public override string ToString()
- {
- return ToString(null, null);
- }
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number formatted as specified by the
- /// format string.
- ///
- ///
- /// A format specification.
- ///
- public string ToString(string format)
- {
- return ToString(format, null);
- }
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number formatted as specified by the
- /// format provider.
- ///
- ///
- /// An that supplies culture-specific formatting information.
- ///
- public string ToString(IFormatProvider formatProvider)
- {
- return ToString(null, formatProvider);
- }
-
- ///
- /// A string representation of this complex number.
- ///
- ///
- /// The string representation of this complex number formatted as specified by the
- /// format string and format provider.
- ///
- ///
- /// if the n, is not a number.
- ///
- ///
- /// if s, is .
- ///
- ///
- /// A format specification.
- ///
- ///
- /// An that supplies culture-specific formatting information.
- ///
- public string ToString(string format, IFormatProvider formatProvider)
- {
- var ret = new StringBuilder();
- ret.Append("(").Append(_real.ToString(format, formatProvider)).Append(", ").Append(_imag.ToString(format, formatProvider)).Append(")");
- return ret.ToString();
- }
-
- #endregion
-
- #region IEquatable Members
-
- ///
- /// Checks if two complex numbers are equal. Two complex numbers are equal if their
- /// corresponding real and imaginary components are equal.
- ///
- ///
- /// Returns true if the two objects are the same object, or if their corresponding
- /// real and imaginary components are equal, false otherwise.
- ///
- ///
- /// The complex number to compare to with.
- ///
- public bool Equals(Complex other)
- {
- if (IsNaN() || other.IsNaN())
- {
- return false;
- }
-
- if (IsInfinity() && other.IsInfinity())
- {
- return true;
- }
-
- return _real.AlmostEqual(other._real) && _imag.AlmostEqual(other._imag);
- }
-
- ///
- /// The hash code for the complex number.
- ///
- ///
- /// The hash code of the complex number.
- ///
- ///
- /// The hash code is calculated as
- /// System.Math.Exp(ComplexMath.Absolute(complexNumber)).
- ///
- public override int GetHashCode()
- {
- return _real.GetHashCode() ^ (-_imag.GetHashCode());
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ get { return Math.Atan2(_imag, _real); }
}
///
- /// Checks if two complex numbers are equal. Two complex numbers are equal if their
- /// corresponding real and imaginary components are equal.
+ /// Gets the magnitude (or absolute value) of a complex number.
///
- ///
- /// Returns true if the two objects are the same object, or if their corresponding
- /// real and imaginary components are equal, false otherwise.
- ///
- ///
- /// The complex number to compare to with.
- ///
- public override bool Equals(object obj)
+ /// The magnitude of the current instance.
+ public double Magnitude
{
- return (obj is Complex) && Equals((Complex)obj);
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ get { return Math.Sqrt((_real * _real) + (_imag * _imag)); }
}
- #endregion
-
- #region Operators
-
///
/// Equality test.
///
@@ -891,10 +339,10 @@ namespace System.Numerics
if (divisor.IsZero())
{
- return Infinity;
+ return PositiveInfinity;
}
- var modSquared = divisor.MagnitudeSquared;
+ var modSquared = divisor.MagnitudeSquared();
return new Complex(
((dividend._real * divisor._real) + (dividend._imag * divisor._imag)) / modSquared,
((dividend._imag * divisor._real) - (dividend._real * divisor._imag)) / modSquared);
@@ -913,10 +361,10 @@ namespace System.Numerics
if (divisor.IsZero())
{
- return Infinity;
+ return PositiveInfinity;
}
- var zmod = divisor.MagnitudeSquared;
+ var zmod = divisor.MagnitudeSquared();
return new Complex(dividend * divisor._real / zmod, -dividend * divisor._imag / zmod);
}
@@ -933,111 +381,148 @@ namespace System.Numerics
if (divisor == 0.0d)
{
- return Infinity;
+ return PositiveInfinity;
}
return new Complex(dividend._real / divisor, dividend._imag / divisor);
}
+ #region IFormattable Members
+
///
- /// Unary addition.
+ /// A string representation of this complex number.
///
///
- /// Returns the same complex number.
+ /// The string representation of this complex number.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex Plus()
+ public override string ToString()
{
- return this;
+ return ToString(null, null);
}
///
- /// Unary minus.
+ /// A string representation of this complex number.
///
///
- /// The negated value of this complex number.
+ /// The string representation of this complex number formatted as specified by the
+ /// format string.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex Negate()
+ ///
+ /// A format specification.
+ ///
+ public string ToString(string format)
+ {
+ return ToString(format, null);
+ }
+
+ ///
+ /// A string representation of this complex number.
+ ///
+ ///
+ /// The string representation of this complex number formatted as specified by the
+ /// format provider.
+ ///
+ ///
+ /// An that supplies culture-specific formatting information.
+ ///
+ public string ToString(IFormatProvider formatProvider)
{
- return -this;
+ return ToString(null, formatProvider);
}
///
- /// Adds a complex number to this one.
+ /// A string representation of this complex number.
///
///
- /// The result of the addition.
+ /// The string representation of this complex number formatted as specified by the
+ /// format string and format provider.
///
- ///
- /// The other complex number to add.
+ ///
+ /// if the n, is not a number.
+ ///
+ ///
+ /// if s, is .
+ ///
+ ///
+ /// A format specification.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex Add(Complex other)
+ ///
+ /// An that supplies culture-specific formatting information.
+ ///
+ public string ToString(string format, IFormatProvider formatProvider)
{
- return this + other;
+ var ret = new StringBuilder();
+ ret.Append("(").Append(_real.ToString(format, formatProvider)).Append(", ").Append(_imag.ToString(format, formatProvider)).Append(")");
+ return ret.ToString();
}
+ #endregion
+
+ #region IEquatable Members
+
///
- /// Subtracts a complex number from this one.
+ /// Checks if two complex numbers are equal. Two complex numbers are equal if their
+ /// corresponding real and imaginary components are equal.
///
///
- /// The result of the subtraction.
+ /// Returns true if the two objects are the same object, or if their corresponding
+ /// real and imaginary components are equal, false otherwise.
///
///
- /// The other complex number to subtract from this one.
+ /// The complex number to compare to with.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex Subtract(Complex other)
+ public bool Equals(Complex other)
{
- return this - other;
+ if (this.IsNaN() || other.IsNaN())
+ {
+ return false;
+ }
+
+ if (this.IsInfinity() && other.IsInfinity())
+ {
+ return true;
+ }
+
+ return _real.AlmostEqual(other._real) && _imag.AlmostEqual(other._imag);
}
///
- /// Multiplies this complex number with this one.
+ /// The hash code for the complex number.
///
///
- /// The result of the multiplication.
+ /// The hash code of the complex number.
///
- ///
- /// The complex number to multiply.
- ///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex Multiply(Complex multiplier)
+ ///
+ /// The hash code is calculated as
+ /// System.Math.Exp(ComplexMath.Absolute(complexNumber)).
+ ///
+ public override int GetHashCode()
{
- return this * multiplier;
+ int hash = 27;
+ hash = (13 * hash) + _real.GetHashCode();
+ hash = (13 * hash) + _imag.GetHashCode();
+ return hash;
}
///
- /// Divides this complex number by another.
+ /// Checks if two complex numbers are equal. Two complex numbers are equal if their
+ /// corresponding real and imaginary components are equal.
///
///
- /// The result of the division.
+ /// Returns true if the two objects are the same object, or if their corresponding
+ /// real and imaginary components are equal, false otherwise.
///
- ///
- /// The divisor.
+ ///
+ /// The complex number to compare to with.
///
-#if !PORTABLE
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
-#endif
- public Complex Divide(Complex divisor)
+ public override bool Equals(object obj)
{
- return this / divisor;
+ return (obj is Complex) && Equals((Complex)obj);
}
#endregion
- #region IPrecisionSupport
+ #region IPrecisionSupport
///
/// Returns a Norm of a value of this type, which is appropriate for measuring how
@@ -1048,7 +533,7 @@ namespace System.Numerics
///
double IPrecisionSupport.Norm()
{
- return MagnitudeSquared;
+ return this.MagnitudeSquared();
}
///
@@ -1063,12 +548,12 @@ namespace System.Numerics
///
double IPrecisionSupport.NormOfDifference(Complex otherValue)
{
- return (this - otherValue).MagnitudeSquared;
+ return (this - otherValue).MagnitudeSquared();
}
#endregion
- #region Parse Functions
+ #region Parse Functions
///
/// Creates a complex number based on a string. The string can be in the
@@ -1306,12 +791,12 @@ namespace System.Numerics
}
catch (ArgumentNullException)
{
- result = _zero;
+ result = Zero;
ret = false;
}
catch (FormatException)
{
- result = _zero;
+ result = Zero;
ret = false;
}
@@ -1320,7 +805,7 @@ namespace System.Numerics
#endregion
- #region Conversion
+ #region Conversion
///
/// Explicit conversion of a real decimal to a Complex.
@@ -1458,243 +943,353 @@ namespace System.Numerics
#endregion
///
- /// Gets the absolute value (or magnitude) of a complex number.
+ /// Returns the additive inverse of a specified complex number.
///
+ /// The result of the and components of the parameter multiplied by -1.
/// A complex number.
- /// The absolute value (or magnitude) of a complex number.
- public static double Abs(Complex value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Negate(Complex value)
{
- return value.Magnitude;
+ return -value;
}
///
- /// Trigonometric Arc Cosine of a Complex number.
+ /// Computes the conjugate of a complex number and returns the result.
///
+ /// The conjugate of .
/// A complex number.
- ///
- /// The arc cosine of a complex number.
- ///
- public static Complex Acos(Complex value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Conjugate(Complex value)
{
- return (Complex)value.ToComplex().InverseCosine();
+ return new Complex(value._real, -value._imag);
}
///
- /// Trigonometric Arc Sine of a Complex number.
+ /// Adds two complex numbers and returns the result.
///
- /// A complex number.
- ///
- /// The arc sine of a complex number.
- ///
- public static Complex Asin(Complex value)
+ /// The sum of and .
+ /// The first complex number to add.
+ /// The second complex number to add.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Add(Complex left, Complex right)
{
- return (Complex)value.ToComplex().InverseSine();
+ return left + right;
}
///
- /// Trigonometric Arc Tangent of a Complex number.
+ /// Subtracts one complex number from another and returns the result.
///
- /// A complex number.
- ///
- /// The arc tangent of a complex number.
- ///
- public static Complex Atan(Complex value)
+ /// The result of subtracting from .
+ /// The value to subtract from (the minuend).
+ /// The value to subtract (the subtrahend).
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Subtract(Complex left, Complex right)
{
- return (Complex)value.ToComplex().InverseTangent();
+ return left - right;
}
///
- /// Trigonometric Cosine of a Complex number.
+ /// Returns the product of two complex numbers.
///
- /// A complex number.
- ///
- /// The cosine of a complex number.
- ///
- public static Complex Cos(Complex value)
+ /// The product of the and parameters.
+ /// The first complex number to multiply.
+ /// The second complex number to multiply.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Multiply(Complex left, Complex right)
{
- return (Complex)value.ToComplex().Cosine();
+ return left * right;
}
///
- /// Trigonometric Sine of a Complex number.
+ /// Divides one complex number by another and returns the result.
///
- /// A complex number.
- ///
- /// The Sine of a complex number.
- ///
- public static Complex Sin(Complex value)
+ /// The quotient of the division.
+ /// The complex number to be divided.
+ /// The complex number to divide by.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Divide(Complex dividend, Complex divisor)
{
- return (Complex)value.ToComplex().Sine();
+ return dividend / divisor;
}
///
- /// Trigonometric Tangent of a Complex number.
+ /// Returns the multiplicative inverse of a complex number.
///
+ /// The reciprocal of .
/// A complex number.
- ///
- /// The tangent of a complex number.
- ///
- public static Complex Tan(Complex value)
+ public static Complex Reciprocal(Complex value)
{
- return (Complex)value.ToComplex().Tangent();
+ if (value.IsZero())
+ {
+ return Zero;
+ }
+
+ return 1.0d / value;
}
///
- /// Trigonometric Hyperbolic Cosine of a Complex number.
+ /// Returns the square root of a specified complex number.
///
+ /// The square root of .
/// A complex number.
- ///
- /// The hyperbolic cosine of a complex number.
- ///
- public static Complex Cosh(Complex value)
+ public static Complex Sqrt(Complex value)
{
- return (Complex)value.ToComplex().HyperbolicCosine();
+ if (value.IsRealNonNegative())
+ {
+ return new Complex(Math.Sqrt(value.Real), 0.0);
+ }
+
+ Complex result;
+
+ var absReal = Math.Abs(value.Real);
+ var absImag = Math.Abs(value.Imaginary);
+ double w;
+ if (absReal >= absImag)
+ {
+ var ratio = value.Imaginary / value.Real;
+ w = Math.Sqrt(absReal) * Math.Sqrt(0.5 * (1.0 + Math.Sqrt(1.0 + (ratio * ratio))));
+ }
+ else
+ {
+ var ratio = value.Real / value.Imaginary;
+ w = Math.Sqrt(absImag) * Math.Sqrt(0.5 * (Math.Abs(ratio) + Math.Sqrt(1.0 + (ratio * ratio))));
+ }
+
+ if (value.Real >= 0.0)
+ {
+ result = new Complex(w, value.Imaginary / (2.0 * w));
+ }
+ else if (value.Imaginary >= 0.0)
+ {
+ result = new Complex(absImag / (2.0 * w), w);
+ }
+ else
+ {
+ result = new Complex(absImag / (2.0 * w), -w);
+ }
+
+ return result;
}
///
- /// Trigonometric Hyperbolic Sine of a Complex number.
+ /// Gets the absolute value (or magnitude) of a complex number.
///
/// A complex number.
- ///
- /// The hyperbolic sine of a complex number.
- ///
- public static Complex Sinh(Complex value)
+ /// The absolute value (or magnitude) of a complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static double Abs(Complex value)
{
- return (Complex)value.ToComplex().HyperbolicSine();
+ return value.Magnitude;
}
///
- /// Trigonometric Hyperbolic Tangent of a Complex number.
+ /// Returns e raised to the power specified by a complex number.
///
- /// A complex number.
- ///
- /// The hyperbolic tangent of a complex number.
- ///
- public static Complex Tanh(Complex value)
+ /// The number e raised to the power .
+ /// A complex number that specifies a power.
+ public static Complex Exp(Complex value)
{
- return (Complex)value.ToComplex().HyperbolicTangent();
+ var exp = Math.Exp(value.Real);
+ if (value.IsReal())
+ {
+ return new Complex(exp, 0.0);
+ }
+
+ return new Complex(exp * Trig.Cosine(value.Imaginary), exp * Trig.Sine(value.Imaginary));
}
///
- /// Exponential of a Complex number (exp(x), E^x).
+ /// Returns a specified complex number raised to a power specified by a complex number.
///
- /// A complex number.
- ///
- /// The exponential of a complex number.
- ///
- public static Complex Exp(Complex value)
+ /// The complex number raised to the power .
+ /// A complex number to be raised to a power.
+ /// A complex number that specifies a power.
+ public static Complex Pow(Complex value, Complex power)
{
- return (Complex)value.ToComplex().Exponential();
+ if (value.IsZero())
+ {
+ if (power.IsZero())
+ {
+ return One;
+ }
+
+ if (power.Real > 0.0)
+ {
+ return Zero;
+ }
+
+ if (power.Real < 0)
+ {
+ if (power.Imaginary == 0.0)
+ {
+ return new Complex(double.PositiveInfinity, 0.0);
+ }
+
+ return new Complex(double.PositiveInfinity, double.PositiveInfinity);
+ }
+
+ return double.NaN;
+ }
+
+ return Exp(power * Log(value));
}
///
- /// Constructs a Complex from its magnitude and phase.
+ /// Returns a specified complex number raised to a power specified by a double-precision floating-point number.
///
- ///
- /// Must be non-negative.
- ///
- ///
- /// Real number.
- ///
- ///
- /// A new Complex from the given values.
- ///
- ///
- public static Complex FromPolarCoordinates(double magnitude, double phase)
+ /// The complex number raised to the power .
+ /// A complex number to be raised to a power.
+ /// A double-precision floating-point number that specifies a power.
+ public static Complex Pow(Complex value, double power)
{
- return WithModulusArgument(magnitude, phase);
+ if (value.IsZero())
+ {
+ if (power == 0d)
+ {
+ return One;
+ }
+
+ return power > 0d
+ ? Zero
+ : new Complex(double.PositiveInfinity, 0.0);
+ }
+
+ return Exp(power * Log(value));
}
///
- /// Natural Logarithm of a Complex number (exp(x), E^x).
+ /// Returns the natural (base e) logarithm of a specified complex number.
///
+ /// The natural (base e) logarithm of .
/// A complex number.
- ///
- /// The natural logarithm of a complex number.
- ///
public static Complex Log(Complex value)
{
- return (Complex)value.ToComplex().NaturalLogarithm();
+ if (value.IsRealNonNegative())
+ {
+ return new Complex(Math.Log(value.Real), 0.0);
+ }
+
+ return new Complex(0.5 * Math.Log(value.MagnitudeSquared()), value.Phase);
}
///
- /// Returns the logarithm of a specified complex number in a specified base
+ /// Returns the logarithm of a specified complex number in a specified base.
///
+ /// The logarithm of in base .
/// A complex number.
/// The base of the logarithm.
- /// The logarithm of value in base baseValue.
public static Complex Log(Complex value, double baseValue)
{
- if (baseValue == 1.0)
- {
- return double.NaN;
- }
-
- return (Complex)(value.ToComplex().NaturalLogarithm() / Math.Log(baseValue, Math.E));
+ return Log(value) / Math.Log(baseValue);
}
///
- /// Returns the base-10 logarithm of a specified complex number in a specified base
+ /// Returns the base-10 logarithm of a specified complex number.
///
+ /// The base-10 logarithm of .
/// A complex number.
- /// The base-10 logarithm of the complex number.
public static Complex Log10(Complex value)
{
- return Log(value, 10);
+ return Log(value) / Constants.Ln10;
}
///
- /// Raise this a Complexnumber to the given value.
+ /// Returns the sine of the specified complex number.
///
+ /// The sine of .
/// A complex number.
- /// The exponent.
- ///
- /// The complex number raised to the given exponent.
- ///
- public static Complex Pow(Complex value, Complex power)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Sin(Complex value)
{
- return value.Power(power);
+ return Trig.Sine(value);
}
///
- /// Raise this a Complexnumber to the given value.
+ /// Returns the cosine of the specified complex number.
///
+ /// The cosine of .
/// A complex number.
- /// The exponent.
- ///
- /// The complex number raised to the given exponent.
- ///
- public static Complex Pow(Complex value, double power)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Cos(Complex value)
{
- return value.Power(power);
+ return Trig.Cosine(value);
}
///
- /// Returns the multiplicative inverse of a complex number.
+ /// Returns the tangent of the specified complex number.
///
+ /// The tangent of .
/// A complex number.
- /// The reciprocal of value.
- /// If value is , the method returns . Otherwise, it returns the result of the expression / value.
- public static Complex Reciprocal(Complex value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Tan(Complex value)
{
- if (value.IsZero())
- {
- return _zero;
- }
+ return Trig.Tangent(value);
+ }
- return 1.0d / value;
+ ///
+ /// Returns the angle that is the arc sine of the specified complex number.
+ ///
+ /// The angle which is the arc sine of .
+ /// A complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Asin(Complex value)
+ {
+ return Trig.InverseSine(value);
+ }
+
+ ///
+ /// Returns the angle that is the arc cosine of the specified complex number.
+ ///
+ /// The angle, measured in radians, which is the arc cosine of .
+ /// A complex number that represents a cosine.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Acos(Complex value)
+ {
+ return Trig.InverseCosine(value);
}
///
- /// The Square Root (power 1/2) of a Complex number.
+ /// Returns the angle that is the arc tangent of the specified complex number.
///
+ /// The angle that is the arc tangent of .
/// A complex number.
- ///
- /// The square root of a complex number.
- ///
- public static Complex Sqrt(Complex value)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Atan(Complex value)
+ {
+ return Trig.InverseTangent(value);
+ }
+
+ ///
+ /// Returns the hyperbolic sine of the specified complex number.
+ ///
+ /// The hyperbolic sine of .
+ /// A complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Sinh(Complex value)
+ {
+ return Trig.HyperbolicSine(value);
+ }
+
+ ///
+ /// Returns the hyperbolic cosine of the specified complex number.
+ ///
+ /// The hyperbolic cosine of .
+ /// A complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Cosh(Complex value)
+ {
+ return Trig.HyperbolicCosine(value);
+ }
+
+ ///
+ /// Returns the hyperbolic tangent of the specified complex number.
+ ///
+ /// The hyperbolic tangent of .
+ /// A complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Tanh(Complex value)
{
- return value.SquareRoot();
+ return Trig.HyperbolicTangent(value);
}
}
}
diff --git a/src/Numerics/ComplexExtensions.cs b/src/Numerics/ComplexExtensions.cs
index 27db348b..4d8f8487 100644
--- a/src/Numerics/ComplexExtensions.cs
+++ b/src/Numerics/ComplexExtensions.cs
@@ -34,92 +34,59 @@ namespace MathNet.Numerics
using System.Collections.Generic;
using System.Numerics;
+#if !PORTABLE
+ using System.Runtime;
+#endif
+
///
- /// Extension methods
+ /// Extension methods for the Complex type provided by System.Numerics
///
public static class ComplexExtensions
{
///
- /// Gets a value indicating whether the Complex32 is zero.
+ /// Gets the squared magnitude of the Complex number.
///
/// The number to perfom this operation on.
- /// true if this instance is zero; otherwise, false.
- public static bool IsZero(this Complex complex)
+ /// The squared magnitude of the Complex number.
+ public static double MagnitudeSquared(this Complex complex)
{
- return complex.Real == 0.0 && complex.Imaginary == 0.0;
+ return (complex.Real * complex.Real) + (complex.Imaginary * complex.Imaginary);
}
///
- /// Gets a value indicating whether the Complex32 is one.
+ /// Gets the unity of this complex (same argument, but on the unit circle; exp(I*arg))
///
- /// The number to perfom this operation on.
- /// true if this instance is one; otherwise, false.
- public static bool IsOne(this Complex complex)
+ /// The unity of this Complex.
+ public static Complex Sign(this Complex complex)
{
- return complex.Real == 1.0 && complex.Imaginary == 0.0;
- }
+ if (double.IsPositiveInfinity(complex.Real) && double.IsPositiveInfinity(complex.Imaginary))
+ {
+ return new Complex(Constants.Sqrt1Over2, Constants.Sqrt1Over2);
+ }
- ///
- /// Gets a value indicating whether the Complex32 is the imaginary unit.
- ///
- /// true if this instance is ImaginaryOne; otherwise, false.
- /// The number to perfom this operation on.
- public static bool IsImaginaryOne(this Complex complex)
- {
- return complex.Real == 0.0 && complex.Imaginary == 1.0;
- }
+ if (double.IsPositiveInfinity(complex.Real) && double.IsNegativeInfinity(complex.Imaginary))
+ {
+ return new Complex(Constants.Sqrt1Over2, -Constants.Sqrt1Over2);
+ }
- ///
- /// Gets a value indicating whether the provided Complex32evaluates
- /// to a value that is not a number.
- ///
- /// The number to perfom this operation on.
- ///
- /// true if this instance is NaN; otherwise,
- /// false.
- ///
- public static bool IsNaN(this Complex complex)
- {
- return double.IsNaN(complex.Real) || double.IsNaN(complex.Imaginary);
- }
+ if (double.IsNegativeInfinity(complex.Real) && double.IsPositiveInfinity(complex.Imaginary))
+ {
+ return new Complex(-Constants.Sqrt1Over2, -Constants.Sqrt1Over2);
+ }
- ///
- /// Gets a value indicating whether the provided Complex32 evaluates to an
- /// infinite value.
- ///
- /// The number to perfom this operation on.
- ///
- /// true if this instance is infinite; otherwise, false.
- ///
- ///
- /// True if it either evaluates to a complex infinity
- /// or to a directed infinity.
- ///
- public static bool IsInfinity(this Complex complex)
- {
- return double.IsInfinity(complex.Real) || double.IsInfinity(complex.Imaginary);
- }
+ if (double.IsNegativeInfinity(complex.Real) && double.IsNegativeInfinity(complex.Imaginary))
+ {
+ return new Complex(-Constants.Sqrt1Over2, Constants.Sqrt1Over2);
+ }
- ///
- /// Gets a value indicating whether the provided Complex32 is real.
- ///
- /// The number to perfom this operation on.
- /// true if this instance is a real number; otherwise, false.
- public static bool IsReal(this Complex complex)
- {
- return complex.Imaginary == 0.0;
- }
+ // don't replace this with "Magnitude"!
+ var mod = SpecialFunctions.Hypotenuse(complex.Real, complex.Imaginary);
+ if (mod == 0.0d)
+ {
+ return Complex.Zero;
+ }
- ///
- /// Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0.
- ///
- /// The number to perfom this operation on.
- ///
- /// true if this instance is real nonnegative number; otherwise, false.
- ///
- public static bool IsRealNonNegative(this Complex complex)
- {
- return complex.Imaginary == 0.0f && complex.Real >= 0;
+ return new Complex(complex.Real / mod, complex.Imaginary / mod);
}
///
@@ -139,19 +106,19 @@ namespace MathNet.Numerics
///
///
/// The conjugate of the number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex Conjugate(this Complex complex)
{
- return new Complex(complex.Real, -complex.Imaginary);
+ return Complex.Conjugate(complex);
}
///
- /// Gets the squared magnitude of the Complex number.
+ /// Returns the multiplicative inverse of a complex number.
///
- /// The number to perfom this operation on.
- /// The squared magnitude of the Complex number.
- public static double MagnitudeSquared(this Complex complex)
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Reciprocal(this Complex complex)
{
- return (complex.Real * complex.Real) + (complex.Imaginary * complex.Imaginary);
+ return Complex.Reciprocal(complex);
}
///
@@ -161,15 +128,10 @@ namespace MathNet.Numerics
///
/// The exponential of this complex number.
///
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex Exponential(this Complex complex)
{
- var exp = Math.Exp(complex.Real);
- if (complex.IsReal())
- {
- return new Complex(exp, 0.0);
- }
-
- return new Complex(exp * Trig.Cosine(complex.Imaginary), exp * Trig.Sine(complex.Imaginary));
+ return Complex.Exp(complex);
}
///
@@ -179,14 +141,30 @@ namespace MathNet.Numerics
///
/// The natural logarithm of this complex number.
///
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex NaturalLogarithm(this Complex complex)
{
- if (complex.IsRealNonNegative())
- {
- return new Complex(Math.Log(complex.Real), 0.0);
- }
+ return Complex.Log(complex);
+ }
- return new Complex(0.5 * Math.Log(complex.MagnitudeSquared()), complex.Phase);
+ ///
+ /// Common Logarithm of this Complex (Base 10).
+ ///
+ /// The common logarithm of this complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex CommonLogarithm(this Complex complex)
+ {
+ return Complex.Log10(complex);
+ }
+
+ ///
+ /// Logarithm of this Complex with custom base.
+ ///
+ /// The logarithm of this complex number.
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
+ public static Complex Logarithm(this Complex complex, double baseValue)
+ {
+ return Complex.Log(complex, baseValue);
}
///
@@ -208,25 +186,22 @@ namespace MathNet.Numerics
return Complex.One;
}
- if (exponent.Real > 0.0)
+ if (exponent.Real > 0d)
{
return Complex.Zero;
}
- if (exponent.Real < 0)
+ if (exponent.Real < 0d)
{
- if (exponent.Imaginary == 0.0)
- {
- return new Complex(double.PositiveInfinity, 0.0);
- }
-
- return new Complex(double.PositiveInfinity, double.PositiveInfinity);
+ return exponent.Imaginary == 0d
+ ? new Complex(double.PositiveInfinity, 0d)
+ : new Complex(double.PositiveInfinity, double.PositiveInfinity);
}
- return double.NaN;
+ return new Complex(double.NaN, double.NaN);
}
- return (exponent * complex.NaturalLogarithm()).Exponential();
+ return Complex.Pow(complex, exponent);
}
///
@@ -241,7 +216,7 @@ namespace MathNet.Numerics
///
public static Complex Root(this Complex complex, Complex rootExponent)
{
- return Power(complex, 1 / rootExponent);
+ return Complex.Pow(complex, 1 / rootExponent);
}
///
@@ -268,43 +243,93 @@ namespace MathNet.Numerics
///
/// The square root of this complex number.
///
+ [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public static Complex SquareRoot(this Complex complex)
{
- if (complex.IsRealNonNegative())
- {
- return new Complex(Math.Sqrt(complex.Real), 0.0);
- }
+ return Complex.Sqrt(complex);
+ }
- Complex result;
+ ///
+ /// Gets a value indicating whether the Complex32 is zero.
+ ///
+ /// The number to perfom this operation on.
+ /// true if this instance is zero; otherwise, false.
+ public static bool IsZero(this Complex complex)
+ {
+ return complex.Real == 0.0 && complex.Imaginary == 0.0;
+ }
- var absReal = Math.Abs(complex.Real);
- var absImag = Math.Abs(complex.Imaginary);
- double w;
- if (absReal >= absImag)
- {
- var ratio = complex.Imaginary / complex.Real;
- w = Math.Sqrt(absReal) * Math.Sqrt(0.5 * (1.0 + Math.Sqrt(1.0 + (ratio * ratio))));
- }
- else
- {
- var ratio = complex.Real / complex.Imaginary;
- w = Math.Sqrt(absImag) * Math.Sqrt(0.5 * (Math.Abs(ratio) + Math.Sqrt(1.0 + (ratio * ratio))));
- }
+ ///
+ /// Gets a value indicating whether the Complex32 is one.
+ ///
+ /// The number to perfom this operation on.
+ /// true if this instance is one; otherwise, false.
+ public static bool IsOne(this Complex complex)
+ {
+ return complex.Real == 1.0 && complex.Imaginary == 0.0;
+ }
- if (complex.Real >= 0.0)
- {
- result = new Complex(w, complex.Imaginary / (2.0 * w));
- }
- else if (complex.Imaginary >= 0.0)
- {
- result = new Complex(absImag / (2.0 * w), w);
- }
- else
- {
- result = new Complex(absImag / (2.0 * w), -w);
- }
+ ///
+ /// Gets a value indicating whether the Complex32 is the imaginary unit.
+ ///
+ /// true if this instance is ImaginaryOne; otherwise, false.
+ /// The number to perfom this operation on.
+ public static bool IsImaginaryOne(this Complex complex)
+ {
+ return complex.Real == 0.0 && complex.Imaginary == 1.0;
+ }
+
+ ///
+ /// Gets a value indicating whether the provided Complex32evaluates
+ /// to a value that is not a number.
+ ///
+ /// The number to perfom this operation on.
+ ///
+ /// true if this instance is NaN; otherwise,
+ /// false.
+ ///
+ public static bool IsNaN(this Complex complex)
+ {
+ return double.IsNaN(complex.Real) || double.IsNaN(complex.Imaginary);
+ }
- return result;
+ ///
+ /// Gets a value indicating whether the provided Complex32 evaluates to an
+ /// infinite value.
+ ///
+ /// The number to perfom this operation on.
+ ///
+ /// true if this instance is infinite; otherwise, false.
+ ///
+ ///
+ /// True if it either evaluates to a complex infinity
+ /// or to a directed infinity.
+ ///
+ public static bool IsInfinity(this Complex complex)
+ {
+ return double.IsInfinity(complex.Real) || double.IsInfinity(complex.Imaginary);
+ }
+
+ ///
+ /// Gets a value indicating whether the provided Complex32 is real.
+ ///
+ /// The number to perfom this operation on.
+ /// true if this instance is a real number; otherwise, false.
+ public static bool IsReal(this Complex complex)
+ {
+ return complex.Imaginary == 0.0;
+ }
+
+ ///
+ /// Gets a value indicating whether the provided Complex32 is real and not negative, that is >= 0.
+ ///
+ /// The number to perfom this operation on.
+ ///
+ /// true if this instance is real nonnegative number; otherwise, false.
+ ///
+ public static bool IsRealNonNegative(this Complex complex)
+ {
+ return complex.Imaginary == 0.0f && complex.Real >= 0;
}
///
diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj
index 8a6a9de7..6c590857 100644
--- a/src/Numerics/Numerics.csproj
+++ b/src/Numerics/Numerics.csproj
@@ -104,6 +104,7 @@
+
diff --git a/src/Numerics/TargetedPatchingOptOutAttribute.cs b/src/Numerics/TargetedPatchingOptOutAttribute.cs
new file mode 100644
index 00000000..0408687b
--- /dev/null
+++ b/src/Numerics/TargetedPatchingOptOutAttribute.cs
@@ -0,0 +1,16 @@
+#if PORTABLE
+using System;
+
+namespace MathNet.Numerics
+{
+ [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
+ public class TargetedPatchingOptOutAttribute : Attribute
+ {
+ public string Reason { get; private set; }
+ public TargetedPatchingOptOutAttribute(string reason)
+ {
+ Reason = reason;
+ }
+ }
+}
+#endif
diff --git a/src/Portable/Portable.csproj b/src/Portable/Portable.csproj
index cb907d41..98d20e2e 100644
--- a/src/Portable/Portable.csproj
+++ b/src/Portable/Portable.csproj
@@ -1032,6 +1032,9 @@
Statistics\Statistics.cs
+
+ TargetedPatchingOptOutAttribute.cs
+
Threading\CommonParallel.cs
diff --git a/src/UnitTests/ComplexTests/Complex32Test.TextHandling.cs b/src/UnitTests/ComplexTests/Complex32Test.TextHandling.cs
index 19e55c39..155118c6 100644
--- a/src/UnitTests/ComplexTests/Complex32Test.TextHandling.cs
+++ b/src/UnitTests/ComplexTests/Complex32Test.TextHandling.cs
@@ -90,7 +90,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
var infinity = double.PositiveInfinity.ToString(provider);
Assert.AreEqual("(" + nan + ", " + nan + ")", Complex32.NaN.ToString(provider));
- Assert.AreEqual("(" + infinity + ", " + infinity + ")", Complex32.Infinity.ToString(provider));
+ Assert.AreEqual("(" + infinity + ", " + infinity + ")", Complex32.PositiveInfinity.ToString(provider));
Assert.AreEqual("(0, 0)", Complex32.Zero.ToString(provider));
Assert.AreEqual("(" + String.Format("{0}", number) + ", 0)", new Complex32(1.1f, 0.0f).ToString(provider));
Assert.AreEqual("(" + String.Format("-{0}", number) + ", 0)", new Complex32(-1.1f, 0f).ToString(provider));
@@ -133,7 +133,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
Assert.AreEqual("(1.100, 1.100)", String.Format(culture, "{0:.000}", new Complex32(1.1f, 1.1f)));
Assert.AreEqual("(NaN, NaN)", Complex32.NaN.ToString("#.000", culture));
- Assert.AreEqual("(Infinity, Infinity)", Complex32.Infinity.ToString("#.000", culture));
+ Assert.AreEqual("(Infinity, Infinity)", Complex32.PositiveInfinity.ToString("#.000", culture));
Assert.AreEqual("(.000, .000)", Complex32.Zero.ToString("#.000", culture));
Assert.AreEqual("(1.100, .000)", new Complex32(1.1f, 0.0f).ToString("#.000", culture));
Assert.AreEqual("(.000, -1.100)", new Complex32(0.0f, -1.1f).ToString("#.000", culture));
diff --git a/src/UnitTests/ComplexTests/Complex32Test.cs b/src/UnitTests/ComplexTests/Complex32Test.cs
index 09ce3097..4d133295 100644
--- a/src/UnitTests/ComplexTests/Complex32Test.cs
+++ b/src/UnitTests/ComplexTests/Complex32Test.cs
@@ -45,7 +45,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
Assert.That((Complex32.NaN + float.NaN).IsNaN());
Assert.That((float.NaN + Complex32.NaN).IsNaN());
Assert.That((float.PositiveInfinity + Complex32.One).IsInfinity());
- Assert.That((Complex32.Infinity + 1.0f).IsInfinity());
+ Assert.That((Complex32.PositiveInfinity + 1.0f).IsInfinity());
Assert.That((Complex32.One + 0.0f) == Complex32.One);
Assert.That((0.0f + Complex32.One) == Complex32.One);
Assert.That(new Complex32(1.1f, -2.2f) + 1.1f == new Complex32(2.2f, -2.2f));
@@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
public void CanAddSubtractComplexNumbersUsingOperator()
{
Assert.That((Complex32.NaN - Complex32.NaN).IsNaN());
- Assert.That((Complex32.Infinity - Complex32.One).IsInfinity());
+ Assert.That((Complex32.PositiveInfinity - Complex32.One).IsInfinity());
Assert.That((Complex32.One - Complex32.Zero) == Complex32.One);
Assert.That((new Complex32(1.1f, -2.2f) - new Complex32(1.1f, -2.2f)) == Complex32.Zero);
}
@@ -70,10 +70,10 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanAddTwoComplexNumbers()
{
- Assert.That(Complex32.NaN.Add(Complex32.NaN).IsNaN());
- Assert.That(Complex32.Infinity.Add(Complex32.One).IsInfinity());
- Assert.That(Complex32.One.Add(Complex32.Zero) == Complex32.One);
- Assert.That(new Complex32(1.1f, -2.2f).Add(new Complex32(-1.1f, 2.2f)) == Complex32.Zero);
+ Assert.That(Complex32.Add(Complex32.NaN, (Complex32.NaN)).IsNaN());
+ Assert.That(Complex32.Add(Complex32.PositiveInfinity, Complex32.One).IsInfinity());
+ Assert.That(Complex32.Add(Complex32.One, Complex32.Zero) == Complex32.One);
+ Assert.That(Complex32.Add(new Complex32(1.1f, -2.2f), new Complex32(-1.1f, 2.2f)) == Complex32.Zero);
}
///
@@ -83,7 +83,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
public void CanAddTwoComplexNumbersUsingOperator()
{
Assert.That((Complex32.NaN + Complex32.NaN).IsNaN());
- Assert.That((Complex32.Infinity + Complex32.One).IsInfinity());
+ Assert.That((Complex32.PositiveInfinity + Complex32.One).IsInfinity());
Assert.That((Complex32.One + Complex32.Zero) == Complex32.One);
Assert.That((new Complex32(1.1f, -2.2f) + new Complex32(-1.1f, 2.2f)) == Complex32.Zero);
}
@@ -94,12 +94,11 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanCalculateHashCode()
{
- var complex = new Complex32(1, 0);
- Assert.AreEqual(1065353216, complex.GetHashCode());
- complex = new Complex32(0, 1);
- Assert.AreEqual(-1065353216, complex.GetHashCode());
- complex = new Complex32(1, 1);
- Assert.AreEqual(-16777216, complex.GetHashCode());
+ Assert.AreEqual(new Complex32(1, 2).GetHashCode(), new Complex32(1, 2).GetHashCode());
+ Assert.AreNotEqual(new Complex32(1, 0).GetHashCode(), new Complex32(0, 1).GetHashCode());
+ Assert.AreNotEqual(new Complex32(1, 1).GetHashCode(), new Complex32(2, 2).GetHashCode());
+ Assert.AreNotEqual(new Complex32(1, 0).GetHashCode(), new Complex32(-1, 0).GetHashCode());
+ Assert.AreNotEqual(new Complex32(0, 1).GetHashCode(), new Complex32(0, -1).GetHashCode());
}
///
@@ -285,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanCreateComplexNumberWithModulusArgument()
{
- var complex = Complex32.WithModulusArgument(2, (float)-Math.PI / 6);
+ var complex = Complex32.FromPolarCoordinates(2, (float)-Math.PI / 6);
Assert.AreEqual((float)Math.Sqrt(3), complex.Real, 1e-7f, "Real part is Sqrt(3).");
Assert.AreEqual(-1.0f, complex.Imaginary, 1e-7f, "Imaginary part is -1.");
}
@@ -296,7 +295,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanCreateComplexNumberWithRealImaginaryInitializer()
{
- var complex = Complex32.WithRealImaginary(1.1f, -2.2f);
+ var complex = new Complex32(1.1f, -2.2f);
Assert.AreEqual(1.1f, complex.Real, "Real part is 1.1f.");
Assert.AreEqual(-2.2f, complex.Imaginary, "Imaginary part is -2.2f.");
}
@@ -388,8 +387,8 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
Assert.That((Complex32.NaN * 1.0f).IsNaN());
Assert.AreEqual(new Complex32(-2, 2), new Complex32(4, -4) / -2);
Assert.AreEqual(new Complex32(0.25f, 0.25f), 2 / new Complex32(4, -4));
- Assert.AreEqual(Complex32.Infinity, 2.0f / Complex32.Zero);
- Assert.AreEqual(Complex32.Infinity, Complex32.One / 0);
+ Assert.AreEqual(Complex32.PositiveInfinity, 2.0f / Complex32.Zero);
+ Assert.AreEqual(Complex32.PositiveInfinity, Complex32.One / 0);
}
///
@@ -398,9 +397,9 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanDivideTwoComplexNumbers()
{
- Assert.That(Complex32.NaN.Multiply(Complex32.One).IsNaN());
- Assert.AreEqual(new Complex32(-2, 0), new Complex32(4, -4).Divide(new Complex32(-2, 2)));
- Assert.AreEqual(Complex32.Infinity, Complex32.One.Divide(Complex32.Zero));
+ Assert.That(Complex32.Divide(Complex32.NaN, Complex32.One).IsNaN());
+ Assert.AreEqual(new Complex32(-2, 0), Complex32.Divide(new Complex32(4, -4), new Complex32(-2, 2)));
+ Assert.AreEqual(Complex32.PositiveInfinity, Complex32.Divide(Complex32.One, Complex32.Zero));
}
///
@@ -411,7 +410,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
{
Assert.That((Complex32.NaN / Complex32.One).IsNaN());
Assert.AreEqual(new Complex32(-2, 0), new Complex32(4, -4) / new Complex32(-2, 2));
- Assert.AreEqual(Complex32.Infinity, Complex32.One / Complex32.Zero);
+ Assert.AreEqual(Complex32.PositiveInfinity, Complex32.One / Complex32.Zero);
}
///
@@ -431,8 +430,8 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanMultipleTwoComplexNumbers()
{
- Assert.That(Complex32.NaN.Multiply(Complex32.One).IsNaN());
- Assert.AreEqual(new Complex32(0, 16), new Complex32(4, -4).Multiply(new Complex32(-2, 2)));
+ Assert.That(Complex32.Multiply(Complex32.NaN, Complex32.One).IsNaN());
+ Assert.AreEqual(new Complex32(0, 16), Complex32.Multiply(new Complex32(4, -4), new Complex32(-2, 2)));
}
///
@@ -452,7 +451,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
public void CanNegateValue()
{
var complex = new Complex32(1.1f, -2.2f);
- Assert.AreEqual(new Complex32(-1.1f, 2.2f), complex.Negate());
+ Assert.AreEqual(new Complex32(-1.1f, 2.2f), Complex32.Negate(complex));
}
///
@@ -474,7 +473,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
Assert.That((Complex32.NaN - float.NaN).IsNaN());
Assert.That((float.NaN - Complex32.NaN).IsNaN());
Assert.That((float.PositiveInfinity - Complex32.One).IsInfinity());
- Assert.That((Complex32.Infinity - 1.0f).IsInfinity());
+ Assert.That((Complex32.PositiveInfinity - 1.0f).IsInfinity());
Assert.That((Complex32.One - 0.0f) == Complex32.One);
Assert.That((0.0f - Complex32.One) == -Complex32.One);
Assert.That(new Complex32(1.1f, -2.2f) - 1.1f == new Complex32(0.0f, -2.2f));
@@ -487,10 +486,10 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanSubtractTwoComplexNumbers()
{
- Assert.That(Complex32.NaN.Subtract(Complex32.NaN).IsNaN());
- Assert.That(Complex32.Infinity.Subtract(Complex32.One).IsInfinity());
- Assert.That(Complex32.One.Subtract(Complex32.Zero) == Complex32.One);
- Assert.That(new Complex32(1.1f, -2.2f).Subtract(new Complex32(1.1f, -2.2f)) == Complex32.Zero);
+ Assert.That(Complex32.Subtract(Complex32.NaN, Complex32.NaN).IsNaN());
+ Assert.That(Complex32.Subtract(Complex32.PositiveInfinity, Complex32.One).IsInfinity());
+ Assert.That(Complex32.Subtract(Complex32.One, Complex32.Zero) == Complex32.One);
+ Assert.That(Complex32.Subtract(new Complex32(1.1f, -2.2f), new Complex32(1.1f, -2.2f)) == Complex32.Zero);
}
///
@@ -500,7 +499,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
public void CanTestForEquality()
{
Assert.AreNotEqual(Complex32.NaN, Complex32.NaN);
- Assert.AreEqual(Complex32.Infinity, Complex32.Infinity);
+ Assert.AreEqual(Complex32.PositiveInfinity, Complex32.PositiveInfinity);
Assert.AreEqual(new Complex32(1.1f, -2.2f), new Complex32(1.1f, -2.2f));
Assert.AreNotEqual(new Complex32(-1.1f, 2.2f), new Complex32(1.1f, -2.2f));
}
@@ -512,23 +511,13 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
public void CanTestForEqualityUsingOperators()
{
Assert.That(Complex32.NaN != Complex32.NaN);
- Assert.That(Complex32.Infinity == Complex32.Infinity);
+ Assert.That(Complex32.PositiveInfinity == Complex32.PositiveInfinity);
Assert.That(new Complex32(1.1f, -2.2f) == new Complex32(1.1f, -2.2f));
Assert.That(new Complex32(-1.1f, 2.2f) != new Complex32(1.1f, -2.2f));
}
///
- /// Can use Plus.
- ///
- [Test]
- public void CanUsePlus()
- {
- var complex = new Complex32(1.1f, -2.2f);
- Assert.AreEqual(complex, complex.Plus());
- }
-
- ///
- /// Can use "+" operator.
+ /// Can use unary "+" operator.
///
[Test]
public void CanUsePlusOperator()
@@ -537,15 +526,6 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
Assert.AreEqual(complex, +complex);
}
- ///
- /// With negative modulus argument throws ArgumentOutOfRangeException.
- ///
- [Test]
- public void WithNegativeModulusArgumentThrowsArgumentOutOfRangeException()
- {
- Assert.Throws(() => Complex32.WithModulusArgument(-1, 1), "Throws exception because modulus is negative.");
- }
-
///
/// Can compute magnitude.
///
diff --git a/src/UnitTests/ComplexTests/ComplexTest.cs b/src/UnitTests/ComplexTests/ComplexTest.cs
index 862f88b2..faadf3e6 100644
--- a/src/UnitTests/ComplexTests/ComplexTest.cs
+++ b/src/UnitTests/ComplexTests/ComplexTest.cs
@@ -106,6 +106,7 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
a = new Complex(0.0, 0.0);
b = new Complex(1.0, 0.0);
AssertHelpers.AlmostEqual(new Complex(0.0, 0.0), a.Power(b), 15);
+
a = new Complex(0.0, 0.0);
b = new Complex(-1.0, 0.0);
AssertHelpers.AlmostEqual(new Complex(double.PositiveInfinity, 0.0), a.Power(b), 15);
@@ -123,21 +124,22 @@ namespace MathNet.Numerics.UnitTests.ComplexTests
[Test]
public void CanComputeRoot()
{
- var a = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
- var b = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
- AssertHelpers.AlmostEqual(new Complex(0.0, 0.0), a.Root(b), 15);
- a = new Complex(0.0, -1.19209289550780998537e-7);
- b = new Complex(0.0, 0.5);
- AssertHelpers.AlmostEqual(new Complex(0.038550761943650161, 0.019526430428319544), a.Root(b), 15);
+ var a = new Complex(0.0, -1.19209289550780998537e-7);
+ var b = new Complex(0.0, 0.5);
+ AssertHelpers.AlmostEqual(new Complex(0.038550761943650161, 0.019526430428319544), a.Root(b), 14);
a = new Complex(0.0, 0.5);
b = new Complex(0.0, -0.5);
- AssertHelpers.AlmostEqual(new Complex(0.007927894711475968, -0.042480480425152213), a.Root(b), 15);
+ AssertHelpers.AlmostEqual(new Complex(0.007927894711475968, -0.042480480425152213), a.Root(b), 14);
a = new Complex(0.0, -0.5);
b = new Complex(0.0, 1.0);
- AssertHelpers.AlmostEqual(new Complex(0.15990905692806806, 0.13282699942462053), a.Root(b), 15);
+ AssertHelpers.AlmostEqual(new Complex(0.15990905692806806, 0.13282699942462053), a.Root(b), 14);
a = new Complex(0.0, 2.0);
b = new Complex(0.0, -2.0);
- AssertHelpers.AlmostEqual(new Complex(0.42882900629436788, 0.15487175246424678), a.Root(b), 15);
+ AssertHelpers.AlmostEqual(new Complex(0.42882900629436788, 0.15487175246424678), a.Root(b), 14);
+
+ //a = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
+ //b = new Complex(1.19209289550780998537e-7, 1.19209289550780998537e-7);
+ //AssertHelpers.AlmostEqual(new Complex(0.0, 0.0), a.Root(b), 15);
a = new Complex(0.0, -8.388608e6);
b = new Complex(1.19209289550780998537e-7, 0.0);
AssertHelpers.AlmostEqual(new Complex(double.PositiveInfinity, double.NegativeInfinity), a.Root(b), 15);
diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/VectorTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/VectorTests.cs
index ac0b98f4..7aa015ef 100644
--- a/src/UnitTests/LinearAlgebraTests/Complex32/VectorTests.cs
+++ b/src/UnitTests/LinearAlgebraTests/Complex32/VectorTests.cs
@@ -230,7 +230,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
public void CanGetHashCode()
{
var vector = CreateVector(new[] { new Complex32(1, 1), new Complex32(2, 1), new Complex32(3, 1), new Complex32(4, 1), new Complex32(5, 1) });
- Assert.AreEqual(-1051736064, vector.GetHashCode());
+ Assert.AreEqual(-1042380805, vector.GetHashCode());
}
///