Skip to content

Commit d0e4914

Browse files
Unconstraining Scalar ; adding BigInteger and Complex (#633)
* improving math * Unconstrained * warnings suppressed * WIP: Adding BigInteger and Complex * Keeping adding * #if-ed unavailable API * Other unavailable API #ifed * I love typos * Abs for Complex added. Tests * Tests added * notnull constraint added * Suppress moved out of #if * MathFPort constraints changed to notnull
1 parent 0095b97 commit d0e4914

File tree

7 files changed

+609
-109
lines changed

7 files changed

+609
-109
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System.Numerics;
2+
using Xunit;
3+
4+
namespace Silk.NET.Maths.Tests
5+
{
6+
public class ScalarTests
7+
{
8+
[Fact] public void AddBigInteger()
9+
=> Assert.Equal(new BigInteger(100), Scalar.Add(BigInteger.One, 99));
10+
11+
[Fact] public void SubtractBigInteger()
12+
=> Assert.Equal(new BigInteger(-98), Scalar.Subtract(BigInteger.One, 99));
13+
14+
[Fact] public void MultiplyBigInteger()
15+
=> Assert.Equal(new BigInteger(990), Scalar.Multiply(new BigInteger(10), 99));
16+
17+
[Fact] public void DivideBigInteger()
18+
=> Assert.Equal(new BigInteger(5), Scalar.Divide(new BigInteger(16), 3));
19+
20+
[Fact] public void LessThanBigInteger()
21+
=> Assert.True(Scalar.LessThan(new BigInteger(10), 99));
22+
23+
[Fact] public void GreaterThanBigInteger()
24+
=> Assert.False(Scalar.GreaterThan(new BigInteger(10), 99));
25+
26+
[Fact] public void LessThanOrEqualBigInteger()
27+
=> Assert.True(Scalar.LessThanOrEqual(new BigInteger(10), 99));
28+
29+
[Fact] public void GreaterThanOrEqualBigInteger()
30+
=> Assert.False(Scalar.GreaterThanOrEqual(new BigInteger(10), 99));
31+
32+
[Fact] public void EqualBigInteger1()
33+
=> Assert.False(Scalar.Equal(new BigInteger(10), 99));
34+
35+
[Fact] public void EqualBigInteger2()
36+
=> Assert.True(Scalar.Equal(new BigInteger(10), 10));
37+
38+
// [Fact(Skip = "Abs is unmanaged currently")] public void AbsBigInteger()
39+
// => Assert.Equal(new BigInteger(5), Scalar.Abs(new BigInteger(-5)));
40+
41+
42+
[Fact] public void AddComplex()
43+
=> Assert.Equal(new Complex(109, 5), Scalar.Add(new Complex(10, 5), 99));
44+
45+
[Fact] public void SubtractComplex()
46+
=> Assert.Equal(new Complex(-89, 5), Scalar.Subtract(new Complex(10, 5), 99));
47+
48+
[Fact] public void MultiplyComplex()
49+
=> Assert.Equal(new Complex(990, 495), Scalar.Multiply(new Complex(10, 5), 99));
50+
51+
[Fact] public void DivideComplex()
52+
=> Assert.Equal(new Complex(10 / 99d, 5 / 99d), Scalar.Divide(new Complex(10, 5), 99));
53+
54+
[Fact] public void EqualComplex1()
55+
=> Assert.True(Scalar.Equal(new Complex(10, 5), new Complex(10, 5)));
56+
57+
[Fact] public void EqualComplex2()
58+
=> Assert.False(Scalar.Equal(new Complex(10, 5), new Complex(10, 6)));
59+
60+
[Fact] public void IsFiniteComplex1()
61+
=> Assert.True(Scalar.IsFinite(new Complex(10, 5)));
62+
63+
[Fact] public void IsFiniteComplex2()
64+
=> Assert.False(Scalar.IsFinite(new Complex(double.NaN, 5)));
65+
66+
[Fact] public void IsFiniteComplex3()
67+
=> Assert.False(Scalar.IsFinite(new Complex(10, double.NaN)));
68+
69+
[Fact] public void IsFiniteComplex4()
70+
=> Assert.False(Scalar.IsFinite(new Complex(10, double.NegativeInfinity)));
71+
72+
[Fact] public void IsInfinityComplex1()
73+
=> Assert.True(Scalar.IsInfinity(new Complex(double.NegativeInfinity, 5)));
74+
75+
[Fact] public void IsInfinityComplex2()
76+
=> Assert.True(Scalar.IsInfinity(new Complex(5, double.NegativeInfinity)));
77+
78+
[Fact] public void IsInfinityComplex3()
79+
=> Assert.True(Scalar.IsInfinity(new Complex(double.PositiveInfinity, 5)));
80+
81+
[Fact] public void IsInfinityComplex4()
82+
=> Assert.True(Scalar.IsInfinity(new Complex(5, double.PositiveInfinity)));
83+
84+
[Fact] public void AbsComplex()
85+
=> Assert.Equal(new Complex(5, 0), Scalar.Abs(new Complex(3, 4)));
86+
}
87+
}

src/Maths/Silk.NET.Maths/Scalar.As.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
using System;
55
using System.Runtime.CompilerServices;
66

7+
// casting into non-nullable, unboxing from nullable
8+
#pragma warning disable 8600
9+
#pragma warning disable 8605
10+
711
namespace Silk.NET.Maths
812
{
913
/// <summary>
@@ -22,7 +26,7 @@ public partial class Scalar
2226
/// <typeparam name="TTo">The type converted into</typeparam>
2327
/// <returns>The converted value</returns>
2428
[MethodImpl(MaxOpt)]
25-
public static TTo As<TFrom, TTo>(TFrom val) where TTo : unmanaged where TFrom : unmanaged
29+
public static TTo As<TFrom, TTo>(TFrom val) where TFrom : notnull where TTo : notnull
2630
{
2731
if (typeof(TFrom) == typeof(Half) && typeof(TTo) == typeof(Half))
2832
{

0 commit comments

Comments
 (0)