1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using Xunit;
6 using Xunit.Sdk;
7 using System.Collections.Generic;
8 
9 namespace System.Tests
10 {
11     public static partial class MathTests
12     {
13         // binary64 (double) has a machine epsilon of 2^-52 (approx. 2.22e-16). However, this
14         // is slightly too accurate when writing tests meant to run against libm implementations
15         // for various platforms. 2^-50 (approx. 8.88e-16) seems to be as accurate as we can get.
16         //
17         // The tests themselves will take CrossPlatformMachineEpsilon and adjust it according to the expected result
18         // so that the delta used for comparison will compare the most significant digits and ignore
19         // any digits that are outside the double precision range (15-17 digits).
20         //
21         // For example, a test with an expect result in the format of 0.xxxxxxxxxxxxxxxxx will use
22         // CrossPlatformMachineEpsilon for the variance, while an expected result in the format of 0.0xxxxxxxxxxxxxxxxx
23         // will use CrossPlatformMachineEpsilon / 10 and and expected result in the format of x.xxxxxxxxxxxxxxxx will
24         // use CrossPlatformMachineEpsilon * 10.
25         private const double CrossPlatformMachineEpsilon = 8.8817841970012523e-16;
26 
27         // binary32 (float) has a machine epsilon of 2^-23 (approx. 1.19e-07). However, this
28         // is slightly too accurate when writing tests meant to run against libm implementations
29         // for various platforms. 2^-21 (approx. 4.76e-07) seems to be as accurate as we can get.
30         //
31         // The tests themselves will take CrossPlatformMachineEpsilon and adjust it according to the expected result
32         // so that the delta used for comparison will compare the most significant digits and ignore
33         // any digits that are outside the single precision range (6-9 digits).
34 
35         // For example, a test with an expect result in the format of 0.xxxxxxxxx will use
36         // CrossPlatformMachineEpsilon for the variance, while an expected result in the format of 0.0xxxxxxxxx
37         // will use CrossPlatformMachineEpsilon / 10 and expected result in the format of x.xxxxxx will
38         // use CrossPlatformMachineEpsilon * 10.
39         private const float CrossPlatformMachineEpsilonSingle = 4.76837158e-07f;
40 
41         /// <summary>Verifies that two <see cref="double"/> values are equal, within the <paramref name="allowedVariance"/>.</summary>
42         /// <param name="expected">The expected value</param>
43         /// <param name="actual">The value to be compared against</param>
44         /// <param name="allowedVariance">The total variance allowed between the expected and actual results.</param>
45         /// <exception cref="EqualException">Thrown when the values are not equal</exception>
AssertEqual(double expected, double actual, double variance)46         public static void AssertEqual(double expected, double actual, double variance)
47         {
48             if (double.IsNaN(expected))
49             {
50                 if (double.IsNaN(actual))
51                 {
52                     return;
53                 }
54 
55                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
56             }
57             else if (double.IsNaN(actual))
58             {
59                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
60             }
61 
62             if (double.IsNegativeInfinity(expected))
63             {
64                 if (double.IsNegativeInfinity(actual))
65                 {
66                     return;
67                 }
68 
69                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
70             }
71             else if (double.IsNegativeInfinity(actual))
72             {
73                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
74             }
75 
76             if (double.IsPositiveInfinity(expected))
77             {
78                 if (double.IsPositiveInfinity(actual))
79                 {
80                     return;
81                 }
82 
83                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
84             }
85             else if (double.IsPositiveInfinity(actual))
86             {
87                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
88             }
89 
90             if (IsNegativeZero(expected))
91             {
92                 if (IsNegativeZero(actual))
93                 {
94                     return;
95                 }
96 
97                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
98                 {
99                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
100                 }
101 
102                 // When the variance is not ±0.0, then we are handling a case where
103                 // the actual result is expected to not be exactly -0.0 on some platforms
104                 // and we should fallback to checking if it is within the allowed variance instead.
105             }
106             else if (IsNegativeZero(actual))
107             {
108                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
109                 {
110                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
111                 }
112 
113                 // When the variance is not ±0.0, then we are handling a case where
114                 // the actual result is expected to not be exactly -0.0 on some platforms
115                 // and we should fallback to checking if it is within the allowed variance instead.
116             }
117 
118             if (IsPositiveZero(expected))
119             {
120                 if (IsPositiveZero(actual))
121                 {
122                     return;
123                 }
124 
125                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
126                 {
127                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
128                 }
129 
130                 // When the variance is not ±0.0, then we are handling a case where
131                 // the actual result is expected to not be exactly +0.0 on some platforms
132                 // and we should fallback to checking if it is within the allowed variance instead.
133             }
134             else if (IsPositiveZero(actual))
135             {
136                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
137                 {
138                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
139                 }
140 
141                 // When the variance is not ±0.0, then we are handling a case where
142                 // the actual result is expected to not be exactly +0.0 on some platforms
143                 // and we should fallback to checking if it is within the allowed variance instead.
144             }
145 
146             var delta = Math.Abs(actual - expected);
147 
148             if (delta > variance)
149             {
150                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
151             }
152         }
153 
154         /// <summary>Verifies that two <see cref="float"/> values are equal, within the <paramref name="variance"/>.</summary>
155         /// <param name="expected">The expected value</param>
156         /// <param name="actual">The value to be compared against</param>
157         /// <param name="variance">The total variance allowed between the expected and actual results.</param>
158         /// <exception cref="EqualException">Thrown when the values are not equal</exception>
AssertEqual(float expected, float actual, float variance)159         private static void AssertEqual(float expected, float actual, float variance)
160         {
161             if (float.IsNaN(expected))
162             {
163                 if (float.IsNaN(actual))
164                 {
165                     return;
166                 }
167 
168                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
169             }
170             else if (float.IsNaN(actual))
171             {
172                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
173             }
174 
175             if (float.IsNegativeInfinity(expected))
176             {
177                 if (float.IsNegativeInfinity(actual))
178                 {
179                     return;
180                 }
181 
182                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
183             }
184             else if (float.IsNegativeInfinity(actual))
185             {
186                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
187             }
188 
189             if (float.IsPositiveInfinity(expected))
190             {
191                 if (float.IsPositiveInfinity(actual))
192                 {
193                     return;
194                 }
195 
196                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
197             }
198             else if (float.IsPositiveInfinity(actual))
199             {
200                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
201             }
202 
203             if (IsNegativeZero(expected))
204             {
205                 if (IsNegativeZero(actual))
206                 {
207                     return;
208                 }
209 
210                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
211                 {
212                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
213                 }
214 
215                 // When the variance is not ±0.0, then we are handling a case where
216                 // the actual result is expected to not be exactly -0.0 on some platforms
217                 // and we should fallback to checking if it is within the allowed variance instead.
218             }
219             else if (IsNegativeZero(actual))
220             {
221                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
222                 {
223                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
224                 }
225 
226                 // When the variance is not ±0.0, then we are handling a case where
227                 // the actual result is expected to not be exactly -0.0 on some platforms
228                 // and we should fallback to checking if it is within the allowed variance instead.
229             }
230 
231             if (IsPositiveZero(expected))
232             {
233                 if (IsPositiveZero(actual))
234                 {
235                     return;
236                 }
237 
238                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
239                 {
240                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
241                 }
242 
243                 // When the variance is not ±0.0, then we are handling a case where
244                 // the actual result is expected to not be exactly +0.0 on some platforms
245                 // and we should fallback to checking if it is within the allowed variance instead.
246             }
247             else if (IsPositiveZero(actual))
248             {
249                 if (IsPositiveZero(variance) || IsNegativeZero(variance))
250                 {
251                     throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
252                 }
253 
254                 // When the variance is not ±0.0, then we are handling a case where
255                 // the actual result is expected to not be exactly +0.0 on some platforms
256                 // and we should fallback to checking if it is within the allowed variance instead.
257             }
258 
259             var delta = Math.Abs(actual - expected);
260 
261             if (delta > variance)
262             {
263                 throw new EqualException(ToStringPadded(expected), ToStringPadded(actual));
264             }
265         }
266 
IsNegativeZero(double value)267         private unsafe static bool IsNegativeZero(double value)
268         {
269             return (*(ulong*)(&value)) == 0x8000000000000000;
270         }
271 
IsNegativeZero(float value)272         private unsafe static bool IsNegativeZero(float value)
273         {
274             return (*(uint*)(&value)) == 0x80000000;
275         }
276 
IsPositiveZero(double value)277         private unsafe static bool IsPositiveZero(double value)
278         {
279             return (*(ulong*)(&value)) == 0x0000000000000000;
280         }
281 
IsPositiveZero(float value)282         private unsafe static bool IsPositiveZero(float value)
283         {
284             return (*(uint*)(&value)) == 0x00000000;
285         }
286 
287         // We have a custom ToString here to ensure that edge cases (specifically ±0.0,
288         // but also NaN and ±∞) are correctly and consistently represented.
ToStringPadded(double value)289         private static string ToStringPadded(double value)
290         {
291             if (double.IsNaN(value))
292             {
293                 return "NaN".PadLeft(20);
294             }
295             else if (double.IsPositiveInfinity(value))
296             {
297                 return "+∞".PadLeft(20);
298             }
299             else if (double.IsNegativeInfinity(value))
300             {
301                 return "-∞".PadLeft(20);
302             }
303             else if (IsNegativeZero(value))
304             {
305                 return "-0.0".PadLeft(20);
306             }
307             else if (IsPositiveZero(value))
308             {
309                 return "+0.0".PadLeft(20);
310             }
311             else
312             {
313                 return $"{value,20:G17}";
314             }
315         }
316 
317         // We have a custom ToString here to ensure that edge cases (specifically ±0.0,
318         // but also NaN and ±∞) are correctly and consistently represented.
ToStringPadded(float value)319         private static string ToStringPadded(float value)
320         {
321             if (double.IsNaN(value))
322             {
323                 return "NaN".PadLeft(10);
324             }
325             else if (double.IsPositiveInfinity(value))
326             {
327                 return "+∞".PadLeft(10);
328             }
329             else if (double.IsNegativeInfinity(value))
330             {
331                 return "-∞".PadLeft(10);
332             }
333             else if (IsNegativeZero(value))
334             {
335                 return "-0.0".PadLeft(10);
336             }
337             else if (IsPositiveZero(value))
338             {
339                 return "+0.0".PadLeft(10);
340             }
341             else
342             {
343                 return $"{value,10:G9}";
344             }
345         }
346 
347         [Fact]
Abs_Decimal()348         public static void Abs_Decimal()
349         {
350             Assert.Equal(3.0m, Math.Abs(3.0m));
351             Assert.Equal(0.0m, Math.Abs(0.0m));
352             Assert.Equal(0.0m, Math.Abs(-0.0m));
353             Assert.Equal(3.0m, Math.Abs(-3.0m));
354             Assert.Equal(decimal.MaxValue, Math.Abs(decimal.MinValue));
355         }
356 
357         [Theory]
358         [InlineData( double.NegativeInfinity, double.PositiveInfinity, 0.0)]
359         [InlineData(-3.1415926535897932,      3.1415926535897932,      CrossPlatformMachineEpsilon * 10)]     // value: -(pi)             expected: (pi)
360         [InlineData(-2.7182818284590452,      2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]     // value: -(e)              expected: (e)
361         [InlineData(-2.3025850929940457,      2.3025850929940457,      CrossPlatformMachineEpsilon * 10)]     // value: -(ln(10))         expected: (ln(10))
362         [InlineData(-1.5707963267948966,      1.5707963267948966,      CrossPlatformMachineEpsilon * 10)]     // value: -(pi / 2)         expected: (pi / 2)
363         [InlineData(-1.4426950408889634,      1.4426950408889634,      CrossPlatformMachineEpsilon * 10)]     // value: -(log2(e))        expected: (log2(e))
364         [InlineData(-1.4142135623730950,      1.4142135623730950,      CrossPlatformMachineEpsilon * 10)]     // value: -(sqrt(2))        expected: (sqrt(2))
365         [InlineData(-1.1283791670955126,      1.1283791670955126,      CrossPlatformMachineEpsilon * 10)]     // value: -(2 / sqrt(pi))   expected: (2 / sqrt(pi))
366         [InlineData(-1.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
367         [InlineData(-0.78539816339744831,     0.78539816339744831,     CrossPlatformMachineEpsilon)]          // value: -(pi / 4)         expected: (pi / 4)
368         [InlineData(-0.70710678118654752,     0.70710678118654752,     CrossPlatformMachineEpsilon)]          // value: -(1 / sqrt(2))    expected: (1 / sqrt(2))
369         [InlineData(-0.69314718055994531,     0.69314718055994531,     CrossPlatformMachineEpsilon)]          // value: -(ln(2))          expected: (ln(2))
370         [InlineData(-0.63661977236758134,     0.63661977236758134,     CrossPlatformMachineEpsilon)]          // value: -(2 / pi)         expected: (2 / pi)
371         [InlineData(-0.43429448190325183,     0.43429448190325183,     CrossPlatformMachineEpsilon)]          // value: -(log10(e))       expected: (log10(e))
372         [InlineData(-0.31830988618379067,     0.31830988618379067,     CrossPlatformMachineEpsilon)]          // value: -(1 / pi)         expected: (1 / pi)
373         [InlineData(-0.0,                     0.0,                     0.0)]
374         [InlineData( double.NaN,              double.NaN,              0.0)]
375         [InlineData( 0.0,                     0.0,                     0.0)]
376         [InlineData( 0.31830988618379067,     0.31830988618379067,     CrossPlatformMachineEpsilon)]          // value:  (1 / pi)         expected: (1 / pi)
377         [InlineData( 0.43429448190325183,     0.43429448190325183,     CrossPlatformMachineEpsilon)]          // value:  (log10(e))       expected: (log10(e))
378         [InlineData( 0.63661977236758134,     0.63661977236758134,     CrossPlatformMachineEpsilon)]          // value:  (2 / pi)         expected: (2 / pi)
379         [InlineData( 0.69314718055994531,     0.69314718055994531,     CrossPlatformMachineEpsilon)]          // value:  (ln(2))          expected: (ln(2))
380         [InlineData( 0.70710678118654752,     0.70710678118654752,     CrossPlatformMachineEpsilon)]          // value:  (1 / sqrt(2))    expected: (1 / sqrt(2))
381         [InlineData( 0.78539816339744831,     0.78539816339744831,     CrossPlatformMachineEpsilon)]          // value:  (pi / 4)         expected: (pi / 4)
382         [InlineData( 1.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
383         [InlineData( 1.1283791670955126,      1.1283791670955126,      CrossPlatformMachineEpsilon * 10)]     // value:  (2 / sqrt(pi))   expected: (2 / sqrt(pi))
384         [InlineData( 1.4142135623730950,      1.4142135623730950,      CrossPlatformMachineEpsilon * 10)]     // value:  (sqrt(2))        expected: (sqrt(2))
385         [InlineData( 1.4426950408889634,      1.4426950408889634,      CrossPlatformMachineEpsilon * 10)]     // value:  (log2(e))        expected: (log2(e))
386         [InlineData( 1.5707963267948966,      1.5707963267948966,      CrossPlatformMachineEpsilon * 10)]     // value:  (pi / 2)         expected: (pi / 2)
387         [InlineData( 2.3025850929940457,      2.3025850929940457,      CrossPlatformMachineEpsilon * 10)]     // value:  (ln(10))         expected: (ln(10))
388         [InlineData( 2.7182818284590452,      2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]     // value:  (e)              expected: (e)
389         [InlineData( 3.1415926535897932,      3.1415926535897932,      CrossPlatformMachineEpsilon * 10)]     // value:  (pi)             expected: (pi)
390         [InlineData( double.PositiveInfinity, double.PositiveInfinity, 0.0)]
Abs_Double(double value, double expectedResult, double allowedVariance)391         public static void Abs_Double(double value, double expectedResult, double allowedVariance)
392         {
393             AssertEqual(expectedResult, Math.Abs(value), allowedVariance);
394         }
395 
396         [Fact]
Abs_Int16()397         public static void Abs_Int16()
398         {
399             Assert.Equal((short)3, Math.Abs((short)3));
400             Assert.Equal((short)0, Math.Abs((short)0));
401             Assert.Equal((short)3, Math.Abs((short)(-3)));
402             Assert.Throws<OverflowException>(() => Math.Abs(short.MinValue));
403         }
404 
405         [Fact]
Abs_Int32()406         public static void Abs_Int32()
407         {
408             Assert.Equal(3, Math.Abs(3));
409             Assert.Equal(0, Math.Abs(0));
410             Assert.Equal(3, Math.Abs(-3));
411             Assert.Throws<OverflowException>(() => Math.Abs(int.MinValue));
412         }
413 
414         [Fact]
Abs_Int64()415         public static void Abs_Int64()
416         {
417             Assert.Equal(3L, Math.Abs(3L));
418             Assert.Equal(0L, Math.Abs(0L));
419             Assert.Equal(3L, Math.Abs(-3L));
420             Assert.Throws<OverflowException>(() => Math.Abs(long.MinValue));
421         }
422 
423         [Fact]
Abs_SByte()424         public static void Abs_SByte()
425         {
426             Assert.Equal((sbyte)3, Math.Abs((sbyte)3));
427             Assert.Equal((sbyte)0, Math.Abs((sbyte)0));
428             Assert.Equal((sbyte)3, Math.Abs((sbyte)(-3)));
429             Assert.Throws<OverflowException>(() => Math.Abs(sbyte.MinValue));
430         }
431 
432         [Theory]
433         [InlineData( float.NegativeInfinity, float.PositiveInfinity, 0.0f)]
434         [InlineData(-3.14159265f,            3.14159265f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(pi)             expected: (pi)
435         [InlineData(-2.71828183f,            2.71828183f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(e)              expected: (e)
436         [InlineData(-2.30258509f,            2.30258509f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(ln(10))         expected: (ln(10))
437         [InlineData(-1.57079633f,            1.57079633f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(pi / 2)         expected: (pi / 2)
438         [InlineData(-1.44269504f,            1.44269504f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(log2(e))        expected: (log2(e))
439         [InlineData(-1.41421356f,            1.41421356f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(sqrt(2))        expected: (sqrt(2))
440         [InlineData(-1.12837917f,            1.12837917f,            CrossPlatformMachineEpsilonSingle * 10)]   // value: -(2 / sqrt(pi))   expected: (2 / sqrt(pi))
441         [InlineData(-1.0f,                   1.0f,                   CrossPlatformMachineEpsilonSingle * 10)]
442         [InlineData(-0.785398163f,           0.785398163f,           CrossPlatformMachineEpsilonSingle)]        // value: -(pi / 4)         expected: (pi / 4)
443         [InlineData(-0.707106781f,           0.707106781f,           CrossPlatformMachineEpsilonSingle)]        // value: -(1 / sqrt(2))    expected: (1 / sqrt(2))
444         [InlineData(-0.693147181f,           0.693147181f,           CrossPlatformMachineEpsilonSingle)]        // value: -(ln(2))          expected: (ln(2))
445         [InlineData(-0.636619772f,           0.636619772f,           CrossPlatformMachineEpsilonSingle)]        // value: -(2 / pi)         expected: (2 / pi)
446         [InlineData(-0.434294482f,           0.434294482f,           CrossPlatformMachineEpsilonSingle)]        // value: -(log10(e))       expected: (log10(e))
447         [InlineData(-0.318309886f,           0.318309886f,           CrossPlatformMachineEpsilonSingle)]        // value: -(1 / pi)         expected: (1 / pi)
448         [InlineData(-0.0f,                   0.0f,                   0.0f)]
449         [InlineData( float.NaN,              float.NaN,              0.0f)]
450         [InlineData( 0.0f,                   0.0f,                   0.0f)]
451         [InlineData( 0.318309886f,           0.318309886f,           CrossPlatformMachineEpsilonSingle)]        // value:  (1 / pi)         expected: (1 / pi)
452         [InlineData( 0.434294482f,           0.434294482f,           CrossPlatformMachineEpsilonSingle)]        // value:  (log10(e))       expected: (log10(e))
453         [InlineData( 0.636619772f,           0.636619772f,           CrossPlatformMachineEpsilonSingle)]        // value:  (2 / pi)         expected: (2 / pi)
454         [InlineData( 0.693147181f,           0.693147181f,           CrossPlatformMachineEpsilonSingle)]        // value:  (ln(2))          expected: (ln(2))
455         [InlineData( 0.707106781f,           0.707106781f,           CrossPlatformMachineEpsilonSingle)]        // value:  (1 / sqrt(2))    expected: (1 / sqrt(2))
456         [InlineData( 0.785398163f,           0.785398163f,           CrossPlatformMachineEpsilonSingle)]        // value:  (pi / 4)         expected: (pi / 4)
457         [InlineData( 1.0f,                   1.0f,                   CrossPlatformMachineEpsilonSingle * 10)]
458         [InlineData( 1.12837917f,            1.12837917f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (2 / sqrt(pi))   expected: (2 / sqrt(pi))
459         [InlineData( 1.41421356f,            1.41421356f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (sqrt(2))        expected: (sqrt(2))
460         [InlineData( 1.44269504f,            1.44269504f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (log2(e))        expected: (log2(e))
461         [InlineData( 1.57079633f,            1.57079633f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (pi / 2)         expected: (pi / 2)
462         [InlineData( 2.30258509f,            2.30258509f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (ln(10))         expected: (ln(10))
463         [InlineData( 2.71828183f,            2.71828183f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (e)              expected: (e)
464         [InlineData( 3.14159265f,            3.14159265f,            CrossPlatformMachineEpsilonSingle * 10)]   // value:  (pi)             expected: (pi)
465         [InlineData( float.PositiveInfinity, float.PositiveInfinity, 0.0f)]
Abs_Single(float value, float expectedResult, float allowedVariance)466         public static void Abs_Single(float value, float expectedResult, float allowedVariance)
467         {
468             AssertEqual(expectedResult, Math.Abs(value), allowedVariance);
469         }
470 
471         [Theory]
472         [InlineData( double.NegativeInfinity, double.NaN,          0.0)]
473         [InlineData(-1.0,                     3.1415926535897932,  CrossPlatformMachineEpsilon * 10)]   // expected:  (pi)
474         [InlineData(-0.91173391478696510,     2.7182818284590452,  CrossPlatformMachineEpsilon * 10)]   // expected:  (e)
475         [InlineData(-0.66820151019031295,     2.3025850929940457,  CrossPlatformMachineEpsilon * 10)]   // expected:  (ln(10))
476         [InlineData( 0.0,                     1.5707963267948966,  CrossPlatformMachineEpsilon * 10)]   // expected:  (pi / 2)
477         [InlineData( double.NaN,              double.NaN,          0.0)]
478         [InlineData( 0.0,                     1.5707963267948966,  CrossPlatformMachineEpsilon * 10)]   // expected:  (pi / 2)
479         [InlineData( 0.12775121753523991,     1.4426950408889634,  CrossPlatformMachineEpsilon * 10)]   // expected:  (log2(e))
480         [InlineData( 0.15594369476537447,     1.4142135623730950,  CrossPlatformMachineEpsilon * 10)]   // expected:  (sqrt(2))
481         [InlineData( 0.42812514788535792,     1.1283791670955126,  CrossPlatformMachineEpsilon * 10)]   // expected:  (2 / sqrt(pi))
482         [InlineData( 0.54030230586813972,     1.0,                 CrossPlatformMachineEpsilon * 10)]
483         [InlineData( 0.70710678118654752,     0.78539816339744831, CrossPlatformMachineEpsilon)]        // expected:  (pi / 4),         value:  (1 / sqrt(2))
484         [InlineData( 0.76024459707563015,     0.70710678118654752, CrossPlatformMachineEpsilon)]        // expected:  (1 / sqrt(2))
485         [InlineData( 0.76923890136397213,     0.69314718055994531, CrossPlatformMachineEpsilon)]        // expected:  (ln(2))
486         [InlineData( 0.80410982822879171,     0.63661977236758134, CrossPlatformMachineEpsilon)]        // expected:  (2 / pi)
487         [InlineData( 0.90716712923909839,     0.43429448190325183, CrossPlatformMachineEpsilon)]        // expected:  (log10(e))
488         [InlineData( 0.94976571538163866,     0.31830988618379067, CrossPlatformMachineEpsilon)]        // expected:  (1 / pi)
489         [InlineData( 1.0,                     0.0,                 0.0 )]
490         [InlineData( double.PositiveInfinity, double.NaN,          0.0 )]
Acos(double value, double expectedResult, double allowedVariance)491         public static void Acos(double value, double expectedResult, double allowedVariance)
492         {
493             AssertEqual(expectedResult, Math.Acos(value), allowedVariance);
494         }
495 
496         [Theory]
497         [InlineData( double.NegativeInfinity,  double.NaN,          0.0)]
498         [InlineData(-1.0,                     -1.5707963267948966,  CrossPlatformMachineEpsilon * 10)]  // expected: -(pi / 2)
499         [InlineData(-0.99180624439366372,     -1.4426950408889634,  CrossPlatformMachineEpsilon * 10)]  // expected: -(log2(e))
500         [InlineData(-0.98776594599273553,     -1.4142135623730950,  CrossPlatformMachineEpsilon * 10)]  // expected: -(sqrt(2))
501         [InlineData(-0.90371945743584630,     -1.1283791670955126,  CrossPlatformMachineEpsilon * 10)]  // expected: -(2 / sqrt(pi))
502         [InlineData(-0.84147098480789651,     -1.0,                 CrossPlatformMachineEpsilon * 10)]
503         [InlineData(-0.74398033695749319,     -0.83900756059574755, CrossPlatformMachineEpsilon)]       // expected: -(pi - ln(10))
504         [InlineData(-0.70710678118654752,     -0.78539816339744831, CrossPlatformMachineEpsilon)]       // expected: -(pi / 4),         value: (1 / sqrt(2))
505         [InlineData(-0.64963693908006244,     -0.70710678118654752, CrossPlatformMachineEpsilon)]       // expected: -(1 / sqrt(2))
506         [InlineData(-0.63896127631363480,     -0.69314718055994531, CrossPlatformMachineEpsilon)]       // expected: -(ln(2))
507         [InlineData(-0.59448076852482208,     -0.63661977236758134, CrossPlatformMachineEpsilon)]       // expected: -(2 / pi)
508         [InlineData(-0.42077048331375735,     -0.43429448190325183, CrossPlatformMachineEpsilon)]       // expected: -(log10(e))
509         [InlineData(-0.41078129050290870,     -0.42331082513074800, CrossPlatformMachineEpsilon)]       // expected: -(pi - e)
510         [InlineData(-0.31296179620778659,     -0.31830988618379067, CrossPlatformMachineEpsilon)]       // expected: -(1 / pi)
511         [InlineData(-0.0,                     -0.0,                 0.0)]
512         [InlineData( double.NaN,               double.NaN,          0.0)]
513         [InlineData( 0.0,                      0.0,                 0.0)]
514         [InlineData( 0.31296179620778659,      0.31830988618379067, CrossPlatformMachineEpsilon)]       // expected:  (1 / pi)
515         [InlineData( 0.41078129050290870,      0.42331082513074800, CrossPlatformMachineEpsilon)]       // expected:  (pi - e)
516         [InlineData( 0.42077048331375735,      0.43429448190325183, CrossPlatformMachineEpsilon)]       // expected:  (log10(e))
517         [InlineData( 0.59448076852482208,      0.63661977236758134, CrossPlatformMachineEpsilon)]       // expected:  (2 / pi)
518         [InlineData( 0.63896127631363480,      0.69314718055994531, CrossPlatformMachineEpsilon)]       // expected:  (ln(2))
519         [InlineData( 0.64963693908006244,      0.70710678118654752, CrossPlatformMachineEpsilon)]       // expected:  (1 / sqrt(2))
520         [InlineData( 0.70710678118654752,      0.78539816339744831, CrossPlatformMachineEpsilon)]       // expected:  (pi / 4),         value: (1 / sqrt(2))
521         [InlineData( 0.74398033695749319,      0.83900756059574755, CrossPlatformMachineEpsilon)]       // expected:  (pi - ln(10))
522         [InlineData( 0.84147098480789651,      1.0,                 CrossPlatformMachineEpsilon * 10)]
523         [InlineData( 0.90371945743584630,      1.1283791670955126,  CrossPlatformMachineEpsilon * 10)]  // expected:  (2 / sqrt(pi))
524         [InlineData( 0.98776594599273553,      1.4142135623730950,  CrossPlatformMachineEpsilon * 10)]  // expected:  (sqrt(2))
525         [InlineData( 0.99180624439366372,      1.4426950408889634,  CrossPlatformMachineEpsilon * 10)]  // expected:  (log2(e))
526         [InlineData( 1.0,                      1.5707963267948966,  CrossPlatformMachineEpsilon * 10)]  // expected:  (pi / 2)
527         [InlineData( double.PositiveInfinity,  double.NaN,          0.0)]
Asin(double value, double expectedResult, double allowedVariance)528         public static void Asin(double value, double expectedResult, double allowedVariance)
529         {
530             AssertEqual(expectedResult, Math.Asin(value), allowedVariance);
531         }
532 
533         [Theory]
534         [InlineData( double.NegativeInfinity, -1.5707963267948966,  CrossPlatformMachineEpsilon * 10)]  // expected: -(pi / 2)
535         [InlineData(-7.7635756709721848,      -1.4426950408889634,  CrossPlatformMachineEpsilon * 10)]  // expected: -(log2(e))
536         [InlineData(-6.3341191670421916,      -1.4142135623730950,  CrossPlatformMachineEpsilon * 10)]  // expected: -(sqrt(2))
537         [InlineData(-2.1108768356626451,      -1.1283791670955126,  CrossPlatformMachineEpsilon * 10)]  // expected: -(2 / sqrt(pi))
538         [InlineData(-1.5574077246549022,      -1.0,                 CrossPlatformMachineEpsilon * 10)]
539         [InlineData(-1.1134071468135374,      -0.83900756059574755, CrossPlatformMachineEpsilon)]       // expected: -(pi - ln(10))
540         [InlineData(-1.0,                     -0.78539816339744831, CrossPlatformMachineEpsilon)]       // expected: -(pi / 4)
541         [InlineData(-0.85451043200960189,     -0.70710678118654752, CrossPlatformMachineEpsilon)]       // expected: -(1 / sqrt(2))
542         [InlineData(-0.83064087786078395,     -0.69314718055994531, CrossPlatformMachineEpsilon)]       // expected: -(ln(2))
543         [InlineData(-0.73930295048660405,     -0.63661977236758134, CrossPlatformMachineEpsilon)]       // expected: -(2 / pi)
544         [InlineData(-0.46382906716062964,     -0.43429448190325183, CrossPlatformMachineEpsilon)]       // expected: -(log10(e))
545         [InlineData(-0.45054953406980750,     -0.42331082513074800, CrossPlatformMachineEpsilon)]       // expected: -(pi - e)
546         [InlineData(-0.32951473309607836,     -0.31830988618379067, CrossPlatformMachineEpsilon)]       // expected: -(1 / pi)
547         [InlineData(-0.0,                     -0.0,                 0.0)]
548         [InlineData( double.NaN,               double.NaN,          0.0)]
549         [InlineData( 0.0,                      0.0,                 0.0)]
550         [InlineData( 0.32951473309607836,      0.31830988618379067, CrossPlatformMachineEpsilon)]       // expected:  (1 / pi)
551         [InlineData( 0.45054953406980750,      0.42331082513074800, CrossPlatformMachineEpsilon)]       // expected:  (pi - e)
552         [InlineData( 0.46382906716062964,      0.43429448190325183, CrossPlatformMachineEpsilon)]       // expected:  (log10(e))
553         [InlineData( 0.73930295048660405,      0.63661977236758134, CrossPlatformMachineEpsilon)]       // expected:  (2 / pi)
554         [InlineData( 0.83064087786078395,      0.69314718055994531, CrossPlatformMachineEpsilon)]       // expected:  (ln(2))
555         [InlineData( 0.85451043200960189,      0.70710678118654752, CrossPlatformMachineEpsilon)]       // expected:  (1 / sqrt(2))
556         [InlineData( 1.0,                      0.78539816339744831, CrossPlatformMachineEpsilon)]       // expected:  (pi / 4)
557         [InlineData( 1.1134071468135374,       0.83900756059574755, CrossPlatformMachineEpsilon)]       // expected:  (pi - ln(10))
558         [InlineData( 1.5574077246549022,       1.0,                 CrossPlatformMachineEpsilon * 10)]
559         [InlineData( 2.1108768356626451,       1.1283791670955126,  CrossPlatformMachineEpsilon * 10)]  // expected:  (2 / sqrt(pi))
560         [InlineData( 6.3341191670421916,       1.4142135623730950,  CrossPlatformMachineEpsilon * 10)]  // expected:  (sqrt(2))
561         [InlineData( 7.7635756709721848,       1.4426950408889634,  CrossPlatformMachineEpsilon * 10)]  // expected:  (log2(e))
562         [InlineData( double.PositiveInfinity,  1.5707963267948966,  CrossPlatformMachineEpsilon * 10)]  // expected:  (pi / 2)
Atan(double value, double expectedResult, double allowedVariance)563         public static void Atan(double value, double expectedResult, double allowedVariance)
564         {
565             AssertEqual(expectedResult, Math.Atan(value), allowedVariance);
566         }
567 
568         public static IEnumerable<object[]> Atan2_TestData
569         {
570             get
571             {
572                 yield return new object[] { double.NegativeInfinity, -1.0, -1.5707963267948966, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi / 2)
573                 yield return new object[] { double.NegativeInfinity, -0.0, -1.5707963267948966, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi / 2)
574                 yield return new object[] { double.NegativeInfinity, double.NaN, double.NaN, 0.0 };
575                 yield return new object[] { double.NegativeInfinity, 0.0, -1.5707963267948966, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi / 2)
576                 yield return new object[] { double.NegativeInfinity, 1.0, -1.5707963267948966, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi / 2)
577                 yield return new object[] { -1.0, -1.0, -2.3561944901923449, CrossPlatformMachineEpsilon * 10 };    // expected: -(3 * pi / 4)
578                 yield return new object[] { -1.0, -0.0, -1.5707963267948966, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi / 2)
579                 yield return new object[] { -1.0, double.NaN, double.NaN, 0.0 };
580                 yield return new object[] { -1.0, 0.0, -1.5707963267948966, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi / 2)
581                 yield return new object[] { -1.0, 1.0, -0.78539816339744831, CrossPlatformMachineEpsilon };         // expected: -(pi / 4)
582                 yield return new object[] { -1.0, double.PositiveInfinity, -0.0, 0.0 };
583                 yield return new object[] { -0.99180624439366372, -0.12775121753523991, -1.6988976127008298, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - log2(e))
584                 yield return new object[] { -0.99180624439366372, 0.12775121753523991, -1.4426950408889634, CrossPlatformMachineEpsilon * 10 };    // expected: -(log2(e))
585                 yield return new object[] { -0.98776594599273553, -0.15594369476537447, -1.7273790912166982, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - sqrt(2))
586                 yield return new object[] { -0.98776594599273553, 0.15594369476537447, -1.4142135623730950, CrossPlatformMachineEpsilon * 10 };    // expected: -(sqrt(2))
587                 yield return new object[] { -0.90371945743584630, -0.42812514788535792, -2.0132134864942807, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - (2 / sqrt(pi))
588                 yield return new object[] { -0.90371945743584630, 0.42812514788535792, -1.1283791670955126, CrossPlatformMachineEpsilon * 10 };    // expected: -(2 / sqrt(pi)
589                 yield return new object[] { -0.84147098480789651, -0.54030230586813972, -2.1415926535897932, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - 1)
590                 yield return new object[] { -0.84147098480789651, 0.54030230586813972, -1.0, CrossPlatformMachineEpsilon * 10 };
591                 yield return new object[] { -0.74398033695749319, -0.66820151019031295, -2.3025850929940457, CrossPlatformMachineEpsilon * 10 };    // expected: -(ln(10))
592                 yield return new object[] { -0.74398033695749319, 0.66820151019031295, -0.83900756059574755, CrossPlatformMachineEpsilon };         // expected: -(pi - ln(10))
593                 yield return new object[] { -0.70710678118654752, -0.70710678118654752, -2.3561944901923449, CrossPlatformMachineEpsilon * 10 };    // expected: -(3 * pi / 4),         y: -(1 / sqrt(2))   x: -(1 / sqrt(2))
594                 yield return new object[] { -0.70710678118654752, 0.70710678118654752, -0.78539816339744831, CrossPlatformMachineEpsilon };         // expected: -(pi / 4),             y: -(1 / sqrt(2))   x:  (1 / sqrt(2))
595                 yield return new object[] { -0.64963693908006244, -0.76024459707563015, -2.4344858724032457, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - (1 / sqrt(2))
596                 yield return new object[] { -0.64963693908006244, 0.76024459707563015, -0.70710678118654752, CrossPlatformMachineEpsilon };         // expected: -(1 / sqrt(2))
597                 yield return new object[] { -0.63896127631363480, -0.76923890136397213, -2.4484454730298479, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - ln(2))
598                 yield return new object[] { -0.63896127631363480, 0.76923890136397213, -0.69314718055994531, CrossPlatformMachineEpsilon };         // expected: -(ln(2))
599                 yield return new object[] { -0.59448076852482208, -0.80410982822879171, -2.5049728812222119, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - (2 / pi))
600                 yield return new object[] { -0.59448076852482208, 0.80410982822879171, -0.63661977236758134, CrossPlatformMachineEpsilon };         // expected: -(2 / pi)
601                 yield return new object[] { -0.42077048331375735, -0.90716712923909839, -2.7072981716865414, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - log10(e))
602                 yield return new object[] { -0.42077048331375735, 0.90716712923909839, -0.43429448190325183, CrossPlatformMachineEpsilon };         // expected: -(log10(e))
603                 yield return new object[] { -0.41078129050290870, -0.91173391478696510, -2.7182818284590452, CrossPlatformMachineEpsilon * 10 };    // expected: -(e)
604                 yield return new object[] { -0.41078129050290870, 0.91173391478696510, -0.42331082513074800, CrossPlatformMachineEpsilon };         // expected: -(pi - e)
605                 yield return new object[] { -0.31296179620778659, -0.94976571538163866, -2.8232827674060026, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi - (1 / pi))
606                 yield return new object[] { -0.31296179620778659, 0.94976571538163866, -0.31830988618379067, CrossPlatformMachineEpsilon };         // expected: -(1 / pi)
607                 yield return new object[] { -0.0, double.NegativeInfinity, -3.1415926535897932, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi)
608                 yield return new object[] { -0.0, -1.0, -3.1415926535897932, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi)
609                 yield return new object[] { -0.0, -0.0, -3.1415926535897932, CrossPlatformMachineEpsilon * 10 };    // expected: -(pi)
610                 yield return new object[] { -0.0, double.NaN, double.NaN, 0.0 };
611                 yield return new object[] { -0.0, 0.0, -0.0, 0.0 };
612                 yield return new object[] { -0.0, 1.0, -0.0, 0.0 };
613                 yield return new object[] { -0.0, double.PositiveInfinity, -0.0, 0.0 };
614                 yield return new object[] { double.NaN, double.NegativeInfinity, double.NaN, 0.0 };
615                 yield return new object[] { double.NaN, -1.0, double.NaN, 0.0 };
616                 yield return new object[] { double.NaN, -0.0, double.NaN, 0.0 };
617                 yield return new object[] { double.NaN, double.NaN, double.NaN, 0.0 };
618                 yield return new object[] { double.NaN, 0.0, double.NaN, 0.0 };
619                 yield return new object[] { double.NaN, 1.0, double.NaN, 0.0 };
620                 yield return new object[] { double.NaN, double.PositiveInfinity, double.NaN, 0.0 };
621                 yield return new object[] { 0.0, double.NegativeInfinity, 3.1415926535897932, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi)
622                 yield return new object[] { 0.0, -1.0, 3.1415926535897932, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi)
623                 yield return new object[] { 0.0, -0.0, 3.1415926535897932, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi)
624                 yield return new object[] { 0.0, double.NaN, double.NaN, 0.0 };
625                 yield return new object[] { 0.0, 0.0, 0.0, 0.0 };
626                 yield return new object[] { 0.0, 1.0, 0.0, 0.0 };
627                 yield return new object[] { 0.0, double.PositiveInfinity, 0.0, 0.0 };
628                 yield return new object[] { 0.31296179620778659, -0.94976571538163866, 2.8232827674060026, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - (1 / pi))
629                 yield return new object[] { 0.31296179620778659, 0.94976571538163866, 0.31830988618379067, CrossPlatformMachineEpsilon };          // expected:  (1 / pi)
630                 yield return new object[] { 0.41078129050290870, -0.91173391478696510, 2.7182818284590452, CrossPlatformMachineEpsilon * 10 };     // expected:  (e)
631                 yield return new object[] { 0.41078129050290870, 0.91173391478696510, 0.42331082513074800, CrossPlatformMachineEpsilon };          // expected:  (pi - e)
632                 yield return new object[] { 0.42077048331375735, -0.90716712923909839, 2.7072981716865414, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - log10(e))
633                 yield return new object[] { 0.42077048331375735, 0.90716712923909839, 0.43429448190325183, CrossPlatformMachineEpsilon };          // expected:  (log10(e))
634                 yield return new object[] { 0.59448076852482208, -0.80410982822879171, 2.5049728812222119, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - (2 / pi))
635                 yield return new object[] { 0.59448076852482208, 0.80410982822879171, 0.63661977236758134, CrossPlatformMachineEpsilon };          // expected:  (2 / pi)
636                 yield return new object[] { 0.63896127631363480, -0.76923890136397213, 2.4484454730298479, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - ln(2))
637                 yield return new object[] { 0.63896127631363480, 0.76923890136397213, 0.69314718055994531, CrossPlatformMachineEpsilon };          // expected:  (ln(2))
638                 yield return new object[] { 0.64963693908006244, -0.76024459707563015, 2.4344858724032457, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - (1 / sqrt(2))
639                 yield return new object[] { 0.64963693908006244, 0.76024459707563015, 0.70710678118654752, CrossPlatformMachineEpsilon };          // expected:  (1 / sqrt(2))
640                 yield return new object[] { 0.70710678118654752, -0.70710678118654752, 2.3561944901923449, CrossPlatformMachineEpsilon * 10 };     // expected:  (3 * pi / 4),         y:  (1 / sqrt(2))   x: -(1 / sqrt(2))
641                 yield return new object[] { 0.70710678118654752, 0.70710678118654752, 0.78539816339744831, CrossPlatformMachineEpsilon };          // expected:  (pi / 4),             y:  (1 / sqrt(2))   x:  (1 / sqrt(2))
642                 yield return new object[] { 0.74398033695749319, -0.66820151019031295, 2.3025850929940457, CrossPlatformMachineEpsilon * 10 };     // expected:  (ln(10))
643                 yield return new object[] { 0.74398033695749319, 0.66820151019031295, 0.83900756059574755, CrossPlatformMachineEpsilon };          // expected:  (pi - ln(10))
644                 yield return new object[] { 0.84147098480789651, -0.54030230586813972, 2.1415926535897932, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - 1)
645                 yield return new object[] { 0.84147098480789651, 0.54030230586813972, 1.0, CrossPlatformMachineEpsilon * 10 };
646                 yield return new object[] { 0.90371945743584630, -0.42812514788535792, 2.0132134864942807, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - (2 / sqrt(pi))
647                 yield return new object[] { 0.90371945743584630, 0.42812514788535792, 1.1283791670955126, CrossPlatformMachineEpsilon * 10 };     // expected:  (2 / sqrt(pi))
648                 yield return new object[] { 0.98776594599273553, -0.15594369476537447, 1.7273790912166982, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - sqrt(2))
649                 yield return new object[] { 0.98776594599273553, 0.15594369476537447, 1.4142135623730950, CrossPlatformMachineEpsilon * 10 };     // expected:  (sqrt(2))
650                 yield return new object[] { 0.99180624439366372, -0.12775121753523991, 1.6988976127008298, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi - log2(e))
651                 yield return new object[] { 0.99180624439366372, 0.12775121753523991, 1.4426950408889634, CrossPlatformMachineEpsilon * 10 };     // expected:  (log2(e))
652                 yield return new object[] { 1.0, -1.0, 2.3561944901923449, CrossPlatformMachineEpsilon * 10 };     // expected:  (3 * pi / 4)
653                 yield return new object[] { 1.0, -0.0, 1.5707963267948966, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi / 2)
654                 yield return new object[] { 1.0, double.NaN, double.NaN, 0.0 };
655                 yield return new object[] { 1.0, 0.0, 1.5707963267948966, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi / 2)
656                 yield return new object[] { 1.0, 1.0, 0.78539816339744831, CrossPlatformMachineEpsilon };          // expected:  (pi / 4)
657                 yield return new object[] { 1.0, double.PositiveInfinity, 0.0, 0.0 };
658                 yield return new object[] { double.PositiveInfinity, -1.0, 1.5707963267948966, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi / 2)
659                 yield return new object[] { double.PositiveInfinity, -0.0, 1.5707963267948966, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi / 2)
660                 yield return new object[] { double.PositiveInfinity, double.NaN, double.NaN, 0.0 };
661                 yield return new object[] { double.PositiveInfinity, 0.0, 1.5707963267948966, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi / 2)
662                 yield return new object[] { double.PositiveInfinity, 1.0, 1.5707963267948966, CrossPlatformMachineEpsilon * 10 };     // expected:  (pi / 2)
663             }
664         }
665 
666         [Theory]
667         [MemberData(nameof(Atan2_TestData))]
Atan2(double y, double x, double expectedResult, double allowedVariance)668         public static void Atan2(double y, double x, double expectedResult, double allowedVariance)
669         {
670             AssertEqual(expectedResult, Math.Atan2(y, x), allowedVariance);
671         }
672 
673         [Theory]
674         [InlineData( double.NegativeInfinity, double.NegativeInfinity, -2.3561944901923449,  CrossPlatformMachineEpsilon * 10)]    // expected: -(3 * pi / 4)
675         [InlineData( double.NegativeInfinity, double.PositiveInfinity, -0.78539816339744831, CrossPlatformMachineEpsilon)]         // expected: -(pi / 4)
676         [InlineData( double.PositiveInfinity, double.NegativeInfinity,  2.3561944901923449,  CrossPlatformMachineEpsilon * 10)]    // expected:  (3 * pi / 4)
677         [InlineData( double.PositiveInfinity, double.PositiveInfinity,  0.78539816339744831, CrossPlatformMachineEpsilon)]         // expected:  (pi / 4)
678         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
Atan2_IEEE(double y, double x, double expectedResult, double allowedVariance)679         public static void Atan2_IEEE(double y, double x, double expectedResult, double allowedVariance)
680         {
681             AssertEqual(expectedResult, Math.Atan2(y, x), allowedVariance);
682         }
683 
684         [Theory]
685         [InlineData( double.NegativeInfinity, double.NegativeInfinity, double.NaN, 0.0)]
686         [InlineData( double.NegativeInfinity, double.PositiveInfinity, double.NaN, 0.0)]
687         [InlineData( double.PositiveInfinity, double.NegativeInfinity, double.NaN, 0.0)]
688         [InlineData( double.PositiveInfinity, double.PositiveInfinity, double.NaN, 0.0)]
689         [SkipOnTargetFramework(~TargetFrameworkMonikers.NetFramework)]
Atan2_IEEE_Legacy(double y, double x, double expectedResult, double allowedVariance)690         public static void Atan2_IEEE_Legacy(double y, double x, double expectedResult, double allowedVariance)
691         {
692             AssertEqual(expectedResult, Math.Atan2(y, x), allowedVariance);
693         }
694 
695         [Fact]
Ceiling_Decimal()696         public static void Ceiling_Decimal()
697         {
698             Assert.Equal(2.0m, Math.Ceiling(1.1m));
699             Assert.Equal(2.0m, Math.Ceiling(1.9m));
700             Assert.Equal(-1.0m, Math.Ceiling(-1.1m));
701         }
702 
703         [Theory]
704         [InlineData(double.NegativeInfinity,  double.NegativeInfinity, 0.0)]
705         [InlineData(-3.1415926535897932,     -3.0,                     0.0)]    // value: -(pi)
706         [InlineData(-2.7182818284590452,     -2.0,                     0.0)]    // value: -(e)
707         [InlineData(-2.3025850929940457,     -2.0,                     0.0)]    // value: -(ln(10))
708         [InlineData(-1.5707963267948966,     -1.0,                     0.0)]    // value: -(pi / 2)
709         [InlineData(-1.4426950408889634,     -1.0,                     0.0)]    // value: -(log2(e))
710         [InlineData(-1.4142135623730950,     -1.0,                     0.0)]    // value: -(sqrt(2))
711         [InlineData(-1.1283791670955126,     -1.0,                     0.0)]    // value: -(2 / sqrt(pi))
712         [InlineData(-1.0,                    -1.0,                     0.0)]
713         [InlineData(-0.78539816339744831,    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10287")]    // value: -(pi / 4)
714         [InlineData(-0.70710678118654752,    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10287")]    // value: -(1 / sqrt(2))
715         [InlineData(-0.69314718055994531,    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10287")]    // value: -(ln(2))
716         [InlineData(-0.63661977236758134,    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10287")]    // value: -(2 / pi)
717         [InlineData(-0.43429448190325183,    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10287")]    // value: -(log10(e))
718         [InlineData(-0.31830988618379067,    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10287")]    // value: -(1 / pi)
719         [InlineData(-0.0,                    -0.0,                     0.0)]
720         [InlineData( double.NaN,              double.NaN,              0.0)]
721         [InlineData( 0.0,                     0.0,                     0.0)]
722         [InlineData( 0.31830988618379067,     1.0,                     0.0)]    // value:  (1 / pi)
723         [InlineData( 0.43429448190325183,     1.0,                     0.0)]    // value:  (log10(e))
724         [InlineData( 0.63661977236758134,     1.0,                     0.0)]    // value:  (2 / pi)
725         [InlineData( 0.69314718055994531,     1.0,                     0.0)]    // value:  (ln(2))
726         [InlineData( 0.70710678118654752,     1.0,                     0.0)]    // value:  (1 / sqrt(2))
727         [InlineData( 0.78539816339744831,     1.0,                     0.0)]    // value:  (pi / 4)
728         [InlineData( 1.0,                     1.0,                     0.0)]
729         [InlineData( 1.1283791670955126,      2.0,                     0.0)]    // value:  (2 / sqrt(pi))
730         [InlineData( 1.4142135623730950,      2.0,                     0.0)]    // value:  (sqrt(2))
731         [InlineData( 1.4426950408889634,      2.0,                     0.0)]    // value:  (log2(e))
732         [InlineData( 1.5707963267948966,      2.0,                     0.0)]    // value:  (pi / 2)
733         [InlineData( 2.3025850929940457,      3.0,                     0.0)]    // value:  (ln(10))
734         [InlineData( 2.7182818284590452,      3.0,                     0.0)]    // value:  (e)
735         [InlineData( 3.1415926535897932,      4.0,                     0.0)]    // value:  (pi)
736         [InlineData(double.PositiveInfinity, double.PositiveInfinity,  0.0)]
Ceiling_Double(double value, double expectedResult, double allowedVariance)737         public static void Ceiling_Double(double value, double expectedResult, double allowedVariance)
738         {
739             AssertEqual(expectedResult, Math.Ceiling(value), allowedVariance);
740         }
741 
742         [Theory]
743         [InlineData( double.NegativeInfinity,  double.NaN,          0.0)]
744         [InlineData(-3.1415926535897932,      -1.0,                 CrossPlatformMachineEpsilon * 10)]  // value: -(pi)
745         [InlineData(-2.7182818284590452,      -0.91173391478696510, CrossPlatformMachineEpsilon)]       // value: -(e)
746         [InlineData(-2.3025850929940457,      -0.66820151019031295, CrossPlatformMachineEpsilon)]       // value: -(ln(10))
747         [InlineData(-1.5707963267948966,       0.0,                 CrossPlatformMachineEpsilon)]       // value: -(pi / 2)
748         [InlineData(-1.4426950408889634,       0.12775121753523991, CrossPlatformMachineEpsilon)]       // value: -(log2(e))
749         [InlineData(-1.4142135623730950,       0.15594369476537447, CrossPlatformMachineEpsilon)]       // value: -(sqrt(2))
750         [InlineData(-1.1283791670955126,       0.42812514788535792, CrossPlatformMachineEpsilon)]       // value: -(2 / sqrt(pi))
751         [InlineData(-1.0,                      0.54030230586813972, CrossPlatformMachineEpsilon)]
752         [InlineData(-0.78539816339744831,      0.70710678118654752, CrossPlatformMachineEpsilon)]       // value: -(pi / 4),        expected:  (1 / sqrt(2))
753         [InlineData(-0.70710678118654752,      0.76024459707563015, CrossPlatformMachineEpsilon)]       // value: -(1 / sqrt(2))
754         [InlineData(-0.69314718055994531,      0.76923890136397213, CrossPlatformMachineEpsilon)]       // value: -(ln(2))
755         [InlineData(-0.63661977236758134,      0.80410982822879171, CrossPlatformMachineEpsilon)]       // value: -(2 / pi)
756         [InlineData(-0.43429448190325183,      0.90716712923909839, CrossPlatformMachineEpsilon)]       // value: -(log10(e))
757         [InlineData(-0.31830988618379067,      0.94976571538163866, CrossPlatformMachineEpsilon)]       // value: -(1 / pi)
758         [InlineData(-0.0,                      1.0,                 CrossPlatformMachineEpsilon * 10)]
759         [InlineData( double.NaN,               double.NaN,          0.0)]
760         [InlineData( 0.0,                      1.0,                 CrossPlatformMachineEpsilon * 10)]
761         [InlineData( 0.31830988618379067,      0.94976571538163866, CrossPlatformMachineEpsilon)]       // value:  (1 / pi)
762         [InlineData( 0.43429448190325183,      0.90716712923909839, CrossPlatformMachineEpsilon)]       // value:  (log10(e))
763         [InlineData( 0.63661977236758134,      0.80410982822879171, CrossPlatformMachineEpsilon)]       // value:  (2 / pi)
764         [InlineData( 0.69314718055994531,      0.76923890136397213, CrossPlatformMachineEpsilon)]       // value:  (ln(2))
765         [InlineData( 0.70710678118654752,      0.76024459707563015, CrossPlatformMachineEpsilon)]       // value:  (1 / sqrt(2))
766         [InlineData( 0.78539816339744831,      0.70710678118654752, CrossPlatformMachineEpsilon)]       // value:  (pi / 4),        expected:  (1 / sqrt(2))
767         [InlineData( 1.0,                      0.54030230586813972, CrossPlatformMachineEpsilon)]
768         [InlineData( 1.1283791670955126,       0.42812514788535792, CrossPlatformMachineEpsilon)]       // value:  (2 / sqrt(pi))
769         [InlineData( 1.4142135623730950,       0.15594369476537447, CrossPlatformMachineEpsilon)]       // value:  (sqrt(2))
770         [InlineData( 1.4426950408889634,       0.12775121753523991, CrossPlatformMachineEpsilon)]       // value:  (log2(e))
771         [InlineData( 1.5707963267948966,       0.0,                 CrossPlatformMachineEpsilon)]       // value:  (pi / 2)
772         [InlineData( 2.3025850929940457,      -0.66820151019031295, CrossPlatformMachineEpsilon)]       // value:  (ln(10))
773         [InlineData( 2.7182818284590452,      -0.91173391478696510, CrossPlatformMachineEpsilon)]       // value:  (e)
774         [InlineData( 3.1415926535897932,      -1.0,                 CrossPlatformMachineEpsilon * 10)]  // value:  (pi)
775         [InlineData( double.PositiveInfinity,  double.NaN,          0.0)]
Cos(double value, double expectedResult, double allowedVariance)776         public static void Cos(double value, double expectedResult, double allowedVariance)
777         {
778             AssertEqual(expectedResult, Math.Cos(value), allowedVariance);
779         }
780 
781         [Theory]
782         [InlineData( double.NegativeInfinity, double.PositiveInfinity, 0.0)]
783         [InlineData(-3.1415926535897932,      11.591953275521521,      CrossPlatformMachineEpsilon * 100)]  // value:  (pi)
784         [InlineData(-2.7182818284590452,      7.6101251386622884,      CrossPlatformMachineEpsilon * 10)]   // value:  (e)
785         [InlineData(-2.3025850929940457,      5.05,                    CrossPlatformMachineEpsilon * 10)]   // value:  (ln(10))
786         [InlineData(-1.5707963267948966,      2.5091784786580568,      CrossPlatformMachineEpsilon * 10)]   // value:  (pi / 2)
787         [InlineData(-1.4426950408889634,      2.2341880974508023,      CrossPlatformMachineEpsilon * 10)]   // value:  (log2(e))
788         [InlineData(-1.4142135623730950,      2.1781835566085709,      CrossPlatformMachineEpsilon * 10)]   // value:  (sqrt(2))
789         [InlineData(-1.1283791670955126,      1.7071001431069344,      CrossPlatformMachineEpsilon * 10)]   // value:  (2 / sqrt(pi))
790         [InlineData(-1.0,                     1.5430806348152438,      CrossPlatformMachineEpsilon * 10)]
791         [InlineData(-0.78539816339744831,     1.3246090892520058,      CrossPlatformMachineEpsilon * 10)]   // value:  (pi / 4)
792         [InlineData(-0.70710678118654752,     1.2605918365213561,      CrossPlatformMachineEpsilon * 10)]   // value:  (1 / sqrt(2))
793         [InlineData(-0.69314718055994531,     1.25,                    CrossPlatformMachineEpsilon * 10)]   // value:  (ln(2))
794         [InlineData(-0.63661977236758134,     1.2095794864199787,      CrossPlatformMachineEpsilon * 10)]   // value:  (2 / pi)
795         [InlineData(-0.43429448190325183,     1.0957974645564909,      CrossPlatformMachineEpsilon * 10)]   // value:  (log10(e))
796         [InlineData(-0.31830988618379067,     1.0510897883672876,      CrossPlatformMachineEpsilon * 10)]   // value:  (1 / pi)
797         [InlineData(-0.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
798         [InlineData( double.NaN,              double.NaN,              0.0)]
799         [InlineData( 0.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
800         [InlineData( 0.31830988618379067,     1.0510897883672876,      CrossPlatformMachineEpsilon * 10)]   // value:  (1 / pi)
801         [InlineData( 0.43429448190325183,     1.0957974645564909,      CrossPlatformMachineEpsilon * 10)]   // value:  (log10(e))
802         [InlineData( 0.63661977236758134,     1.2095794864199787,      CrossPlatformMachineEpsilon * 10)]   // value:  (2 / pi)
803         [InlineData( 0.69314718055994531,     1.25,                    CrossPlatformMachineEpsilon * 10)]   // value:  (ln(2))
804         [InlineData( 0.70710678118654752,     1.2605918365213561,      CrossPlatformMachineEpsilon * 10)]   // value:  (1 / sqrt(2))
805         [InlineData( 0.78539816339744831,     1.3246090892520058,      CrossPlatformMachineEpsilon * 10)]   // value:  (pi / 4)
806         [InlineData( 1.0,                     1.5430806348152438,      CrossPlatformMachineEpsilon * 10)]
807         [InlineData( 1.1283791670955126,      1.7071001431069344,      CrossPlatformMachineEpsilon * 10)]   // value:  (2 / sqrt(pi))
808         [InlineData( 1.4142135623730950,      2.1781835566085709,      CrossPlatformMachineEpsilon * 10)]   // value:  (sqrt(2))
809         [InlineData( 1.4426950408889634,      2.2341880974508023,      CrossPlatformMachineEpsilon * 10)]   // value:  (log2(e))
810         [InlineData( 1.5707963267948966,      2.5091784786580568,      CrossPlatformMachineEpsilon * 10)]   // value:  (pi / 2)
811         [InlineData( 2.3025850929940457,      5.05,                    CrossPlatformMachineEpsilon * 10)]   // value:  (ln(10))
812         [InlineData( 2.7182818284590452,      7.6101251386622884,      CrossPlatformMachineEpsilon * 10)]   // value:  (e)
813         [InlineData( 3.1415926535897932,      11.591953275521521,      CrossPlatformMachineEpsilon * 100)]  // value:  (pi)
814         [InlineData( double.PositiveInfinity, double.PositiveInfinity, 0.0)]
Cosh(double value, double expectedResult, double allowedVariance)815         public static void Cosh(double value, double expectedResult, double allowedVariance)
816         {
817             AssertEqual(expectedResult, Math.Cosh(value), allowedVariance);
818         }
819 
820         [Theory]
821         [InlineData( double.NegativeInfinity, 0.0,                     CrossPlatformMachineEpsilon)]
822         [InlineData(-3.1415926535897932,      0.043213918263772250,    CrossPlatformMachineEpsilon / 10)]   // value: -(pi)
823         [InlineData(-2.7182818284590452,      0.065988035845312537,    CrossPlatformMachineEpsilon / 10)]   // value: -(e)
824         [InlineData(-2.3025850929940457,      0.1,                     CrossPlatformMachineEpsilon)]        // value: -(ln(10))
825         [InlineData(-1.5707963267948966,      0.20787957635076191,     CrossPlatformMachineEpsilon)]        // value: -(pi / 2)
826         [InlineData(-1.4426950408889634,      0.23629008834452270,     CrossPlatformMachineEpsilon)]        // value: -(log2(e))
827         [InlineData(-1.4142135623730950,      0.24311673443421421,     CrossPlatformMachineEpsilon)]        // value: -(sqrt(2))
828         [InlineData(-1.1283791670955126,      0.32355726390307110,     CrossPlatformMachineEpsilon)]        // value: -(2 / sqrt(pi))
829         [InlineData(-1.0,                     0.36787944117144232,     CrossPlatformMachineEpsilon)]
830         [InlineData(-0.78539816339744831,     0.45593812776599624,     CrossPlatformMachineEpsilon)]        // value: -(pi / 4)
831         [InlineData(-0.70710678118654752,     0.49306869139523979,     CrossPlatformMachineEpsilon)]        // value: -(1 / sqrt(2))
832         [InlineData(-0.69314718055994531,     0.5,                     CrossPlatformMachineEpsilon)]        // value: -(ln(2))
833         [InlineData(-0.63661977236758134,     0.52907780826773535,     CrossPlatformMachineEpsilon)]        // value: -(2 / pi)
834         [InlineData(-0.43429448190325183,     0.64772148514180065,     CrossPlatformMachineEpsilon)]        // value: -(log10(e))
835         [InlineData(-0.31830988618379067,     0.72737734929521647,     CrossPlatformMachineEpsilon)]        // value: -(1 / pi)
836         [InlineData(-0.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
837         [InlineData( double.NaN,              double.NaN,              0.0)]
838         [InlineData( 0.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
839         [InlineData( 0.31830988618379067,     1.3748022274393586,      CrossPlatformMachineEpsilon * 10)]   // value:  (1 / pi)
840         [InlineData( 0.43429448190325183,     1.5438734439711811,      CrossPlatformMachineEpsilon * 10)]   // value:  (log10(e))
841         [InlineData( 0.63661977236758134,     1.8900811645722220,      CrossPlatformMachineEpsilon * 10)]   // value:  (2 / pi)
842         [InlineData( 0.69314718055994531,     2.0,                     CrossPlatformMachineEpsilon * 10)]   // value:  (ln(2))
843         [InlineData( 0.70710678118654752,     2.0281149816474725,      CrossPlatformMachineEpsilon * 10)]   // value:  (1 / sqrt(2))
844         [InlineData( 0.78539816339744831,     2.1932800507380155,      CrossPlatformMachineEpsilon * 10)]   // value:  (pi / 4)
845         [InlineData( 1.0,                     2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]   //                          expected: (e)
846         [InlineData( 1.1283791670955126,      3.0906430223107976,      CrossPlatformMachineEpsilon * 10)]   // value:  (2 / sqrt(pi))
847         [InlineData( 1.4142135623730950,      4.1132503787829275,      CrossPlatformMachineEpsilon * 10)]   // value:  (sqrt(2))
848         [InlineData( 1.4426950408889634,      4.2320861065570819,      CrossPlatformMachineEpsilon * 10)]   // value:  (log2(e))
849         [InlineData( 1.5707963267948966,      4.8104773809653517,      CrossPlatformMachineEpsilon * 10)]   // value:  (pi / 2)
850         [InlineData( 2.3025850929940457,      10.0,                    CrossPlatformMachineEpsilon * 100)]  // value:  (ln(10))
851         [InlineData( 2.7182818284590452,      15.154262241479264,      CrossPlatformMachineEpsilon * 100)]  // value:  (e)
852         [InlineData( 3.1415926535897932,      23.140692632779269,      CrossPlatformMachineEpsilon * 100)]  // value:  (pi)
853         [InlineData( double.PositiveInfinity, double.PositiveInfinity, 0.0)]
Exp(double value, double expectedResult, double allowedVariance)854         public static void Exp(double value, double expectedResult, double allowedVariance)
855         {
856             AssertEqual(expectedResult, Math.Exp(value), allowedVariance);
857         }
858 
859         [Fact]
Floor_Decimal()860         public static void Floor_Decimal()
861         {
862             Assert.Equal(1.0m, Math.Floor(1.1m));
863             Assert.Equal(1.0m, Math.Floor(1.9m));
864             Assert.Equal(-2.0m, Math.Floor(-1.1m));
865         }
866 
867         [Theory]
868         [InlineData(double.NegativeInfinity,  double.NegativeInfinity, 0.0)]
869         [InlineData(-3.1415926535897932,     -4.0,                     0.0)]    // value: -(pi)
870         [InlineData(-2.7182818284590452,     -3.0,                     0.0)]    // value: -(e)
871         [InlineData(-2.3025850929940457,     -3.0,                     0.0)]    // value: -(ln(10))
872         [InlineData(-1.5707963267948966,     -2.0,                     0.0)]    // value: -(pi / 2)
873         [InlineData(-1.4426950408889634,     -2.0,                     0.0)]    // value: -(log2(e))
874         [InlineData(-1.4142135623730950,     -2.0,                     0.0)]    // value: -(sqrt(2))
875         [InlineData(-1.1283791670955126,     -2.0,                     0.0)]    // value: -(2 / sqrt(pi))
876         [InlineData(-1.0,                    -1.0,                     0.0)]
877         [InlineData(-0.78539816339744831,    -1.0,                     0.0)]    // value: -(pi / 4)
878         [InlineData(-0.70710678118654752,    -1.0,                     0.0)]    // value: -(1 / sqrt(2))
879         [InlineData(-0.69314718055994531,    -1.0,                     0.0)]    // value: -(ln(2))
880         [InlineData(-0.63661977236758134,    -1.0,                     0.0)]    // value: -(2 / pi)
881         [InlineData(-0.43429448190325183,    -1.0,                     0.0)]    // value: -(log10(e))
882         [InlineData(-0.31830988618379067,    -1.0,                     0.0)]    // value: -(1 / pi)
883         [InlineData(-0.0,                    -0.0,                     0.0, Skip = "https://github.com/dotnet/coreclr/issues/10288")]
884         [InlineData( double.NaN,              double.NaN,              0.0)]
885         [InlineData( 0.0,                     0.0,                     0.0)]
886         [InlineData( 0.31830988618379067,     0.0,                     0.0)]    // value:  (1 / pi)
887         [InlineData( 0.43429448190325183,     0.0,                     0.0)]    // value:  (log10(e))
888         [InlineData( 0.63661977236758134,     0.0,                     0.0)]    // value:  (2 / pi)
889         [InlineData( 0.69314718055994531,     0.0,                     0.0)]    // value:  (ln(2))
890         [InlineData( 0.70710678118654752,     0.0,                     0.0)]    // value:  (1 / sqrt(2))
891         [InlineData( 0.78539816339744831,     0.0,                     0.0)]    // value:  (pi / 4)
892         [InlineData( 1.0,                     1.0,                     0.0)]
893         [InlineData( 1.1283791670955126,      1.0,                     0.0)]    // value:  (2 / sqrt(pi))
894         [InlineData( 1.4142135623730950,      1.0,                     0.0)]    // value:  (sqrt(2))
895         [InlineData( 1.4426950408889634,      1.0,                     0.0)]    // value:  (log2(e))
896         [InlineData( 1.5707963267948966,      1.0,                     0.0)]    // value:  (pi / 2)
897         [InlineData( 2.3025850929940457,      2.0,                     0.0)]    // value:  (ln(10))
898         [InlineData( 2.7182818284590452,      2.0,                     0.0)]    // value:  (e)
899         [InlineData( 3.1415926535897932,      3.0,                     0.0)]    // value:  (pi)
900         [InlineData(double.PositiveInfinity,  double.PositiveInfinity, 0.0)]
Floor_Double(double value, double expectedResult, double allowedVariance)901         public static void Floor_Double(double value, double expectedResult, double allowedVariance)
902         {
903             AssertEqual(expectedResult, Math.Floor(value), allowedVariance);
904         }
905 
906         [Fact]
IEEERemainder()907         public static void IEEERemainder()
908         {
909             Assert.Equal(-1.0, Math.IEEERemainder(3, 2));
910             Assert.Equal(0.0, Math.IEEERemainder(4, 2));
911             Assert.Equal(1.0, Math.IEEERemainder(10, 3));
912             Assert.Equal(-1.0, Math.IEEERemainder(11, 3));
913             Assert.Equal(-2.0, Math.IEEERemainder(28, 5));
914             Assert.Equal(1.8, Math.IEEERemainder(17.8, 4), 10);
915             Assert.Equal(1.4, Math.IEEERemainder(17.8, 4.1), 10);
916             Assert.Equal(0.0999999999999979, Math.IEEERemainder(-16.3, 4.1), 10);
917             Assert.Equal(1.4, Math.IEEERemainder(17.8, -4.1), 10);
918             Assert.Equal(-1.4, Math.IEEERemainder(-17.8, -4.1), 10);
919         }
920 
921         [Theory]
922         [InlineData( double.NegativeInfinity,  double.NaN,              0.0)]
923         [InlineData(-0.0,                      double.NegativeInfinity, 0.0)]
924         [InlineData( double.NaN,               double.NaN,              0.0)]
925         [InlineData( 0.0,                      double.NegativeInfinity, 0.0)]
926         [InlineData( 0.043213918263772250,    -3.1415926535897932,      CrossPlatformMachineEpsilon * 10)]  // expected: -(pi)
927         [InlineData( 0.065988035845312537,    -2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]  // expected: -(e)
928         [InlineData( 0.1,                     -2.3025850929940457,      CrossPlatformMachineEpsilon * 10)]  // expected: -(ln(10))
929         [InlineData( 0.20787957635076191,     -1.5707963267948966,      CrossPlatformMachineEpsilon * 10)]  // expected: -(pi / 2)
930         [InlineData( 0.23629008834452270,     -1.4426950408889634,      CrossPlatformMachineEpsilon * 10)]  // expected: -(log2(e))
931         [InlineData( 0.24311673443421421,     -1.4142135623730950,      CrossPlatformMachineEpsilon * 10)]  // expected: -(sqrt(2))
932         [InlineData( 0.32355726390307110,     -1.1283791670955126,      CrossPlatformMachineEpsilon * 10)]  // expected: -(2 / sqrt(pi))
933         [InlineData( 0.36787944117144232,     -1.0,                     CrossPlatformMachineEpsilon * 10)]
934         [InlineData( 0.45593812776599624,     -0.78539816339744831,     CrossPlatformMachineEpsilon)]       // expected: -(pi / 4)
935         [InlineData( 0.49306869139523979,     -0.70710678118654752,     CrossPlatformMachineEpsilon)]       // expected: -(1 / sqrt(2))
936         [InlineData( 0.5,                     -0.69314718055994531,     CrossPlatformMachineEpsilon)]       // expected: -(ln(2))
937         [InlineData( 0.52907780826773535,     -0.63661977236758134,     CrossPlatformMachineEpsilon)]       // expected: -(2 / pi)
938         [InlineData( 0.64772148514180065,     -0.43429448190325183,     CrossPlatformMachineEpsilon)]       // expected: -(log10(e))
939         [InlineData( 0.72737734929521647,     -0.31830988618379067,     CrossPlatformMachineEpsilon)]       // expected: -(1 / pi)
940         [InlineData( 1.0,                      0.0,                     0.0)]
941         [InlineData( 1.3748022274393586,       0.31830988618379067,     CrossPlatformMachineEpsilon)]       // expected:  (1 / pi)
942         [InlineData( 1.5438734439711811,       0.43429448190325183,     CrossPlatformMachineEpsilon)]       // expected:  (log10(e))
943         [InlineData( 1.8900811645722220,       0.63661977236758134,     CrossPlatformMachineEpsilon)]       // expected:  (2 / pi)
944         [InlineData( 2.0,                      0.69314718055994531,     CrossPlatformMachineEpsilon)]       // expected:  (ln(2))
945         [InlineData( 2.0281149816474725,       0.70710678118654752,     CrossPlatformMachineEpsilon)]       // expected:  (1 / sqrt(2))
946         [InlineData( 2.1932800507380155,       0.78539816339744831,     CrossPlatformMachineEpsilon)]       // expected:  (pi / 4)
947         [InlineData( 2.7182818284590452,       1.0,                     CrossPlatformMachineEpsilon * 10)]  //                              value: (e)
948         [InlineData( 3.0906430223107976,       1.1283791670955126,      CrossPlatformMachineEpsilon * 10)]  // expected:  (2 / sqrt(pi))
949         [InlineData( 4.1132503787829275,       1.4142135623730950,      CrossPlatformMachineEpsilon * 10)]  // expected:  (sqrt(2))
950         [InlineData( 4.2320861065570819,       1.4426950408889634,      CrossPlatformMachineEpsilon * 10)]  // expected:  (log2(e))
951         [InlineData( 4.8104773809653517,       1.5707963267948966,      CrossPlatformMachineEpsilon * 10)]  // expected:  (pi / 2)
952         [InlineData( 10.0,                     2.3025850929940457,      CrossPlatformMachineEpsilon * 10)]  // expected:  (ln(10))
953         [InlineData( 15.154262241479264,       2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]  // expected:  (e)
954         [InlineData( 23.140692632779269,       3.1415926535897932,      CrossPlatformMachineEpsilon * 10)]  // expected:  (pi)
955         [InlineData( double.PositiveInfinity,  double.PositiveInfinity, 0.0)]
Log(double value, double expectedResult, double allowedVariance)956         public static void Log(double value, double expectedResult, double allowedVariance)
957         {
958             AssertEqual(expectedResult, Math.Log(value), allowedVariance);
959         }
960 
961         [Fact]
LogWithBase()962         public static void LogWithBase()
963         {
964             Assert.Equal(1.0, Math.Log(3.0, 3.0));
965             Assert.Equal(2.40217350273, Math.Log(14, 3.0), 10);
966             Assert.Equal(double.NegativeInfinity, Math.Log(0.0, 3.0));
967             Assert.Equal(double.NaN, Math.Log(-3.0, 3.0));
968             Assert.Equal(double.NaN, Math.Log(double.NaN, 3.0));
969             Assert.Equal(double.PositiveInfinity, Math.Log(double.PositiveInfinity, 3.0));
970             Assert.Equal(double.NaN, Math.Log(double.NegativeInfinity, 3.0));
971         }
972 
973         [Theory]
974         [InlineData( double.NegativeInfinity,  double.NaN,              0.0)]
975         [InlineData(-0.0,                      double.NegativeInfinity, 0.0)]
976         [InlineData( double.NaN,               double.NaN,              0.0)]
977         [InlineData( 0.0,                      double.NegativeInfinity, 0.0)]
978         [InlineData( 0.00072178415907472774,  -3.1415926535897932,      CrossPlatformMachineEpsilon * 10)]  // expected: -(pi)
979         [InlineData( 0.0019130141022243176,   -2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]  // expected: -(e)
980         [InlineData( 0.0049821282964407206,   -2.3025850929940457,      CrossPlatformMachineEpsilon * 10)]  // expected: -(ln(10))
981         [InlineData( 0.026866041001136132,    -1.5707963267948966,      CrossPlatformMachineEpsilon * 10)]  // expected: -(pi / 2)
982         [InlineData( 0.036083192820787210,    -1.4426950408889634,      CrossPlatformMachineEpsilon * 10)]  // expected: -(log2(e))
983         [InlineData( 0.038528884700322026,    -1.4142135623730950,      CrossPlatformMachineEpsilon * 10)]  // expected: -(sqrt(2))
984         [InlineData( 0.074408205860642723,    -1.1283791670955126,      CrossPlatformMachineEpsilon * 10)]  // expected: -(2 / sqrt(pi))
985         [InlineData( 0.1,                     -1.0,                     CrossPlatformMachineEpsilon * 10)]
986         [InlineData( 0.16390863613957665,     -0.78539816339744831,     CrossPlatformMachineEpsilon)]       // expected: -(pi / 4)
987         [InlineData( 0.19628775993505562,     -0.70710678118654752,     CrossPlatformMachineEpsilon)]       // expected: -(1 / sqrt(2))
988         [InlineData( 0.20269956628651730,     -0.69314718055994531,     CrossPlatformMachineEpsilon)]       // expected: -(ln(2))
989         [InlineData( 0.23087676451600055,     -0.63661977236758134,     CrossPlatformMachineEpsilon)]       // expected: -(2 / pi)
990         [InlineData( 0.36787944117144232,     -0.43429448190325183,     CrossPlatformMachineEpsilon)]       // expected: -(log10(e))
991         [InlineData( 0.48049637305186868,     -0.31830988618379067,     CrossPlatformMachineEpsilon)]       // expected: -(1 / pi)
992         [InlineData( 1.0,                      0.0,                     0.0)]
993         [InlineData( 2.0811811619898573,       0.31830988618379067,     CrossPlatformMachineEpsilon)]       // expected:  (1 / pi)
994         [InlineData( 2.7182818284590452,       0.43429448190325183,     CrossPlatformMachineEpsilon)]       // expected:  (log10(e))        value: (e)
995         [InlineData( 4.3313150290214525,       0.63661977236758134,     CrossPlatformMachineEpsilon)]       // expected:  (2 / pi)
996         [InlineData( 4.9334096679145963,       0.69314718055994531,     CrossPlatformMachineEpsilon)]       // expected:  (ln(2))
997         [InlineData( 5.0945611704512962,       0.70710678118654752,     CrossPlatformMachineEpsilon)]       // expected:  (1 / sqrt(2))
998         [InlineData( 6.1009598002416937,       0.78539816339744831,     CrossPlatformMachineEpsilon)]       // expected:  (pi / 4)
999         [InlineData( 10.0,                     1.0,                     CrossPlatformMachineEpsilon * 10)]
1000         [InlineData( 13.439377934644400,       1.1283791670955126,      CrossPlatformMachineEpsilon * 10)]  // expected:  (2 / sqrt(pi))
1001         [InlineData( 25.954553519470081,       1.4142135623730950,      CrossPlatformMachineEpsilon * 10)]  // expected:  (sqrt(2))
1002         [InlineData( 27.713733786437790,       1.4426950408889634,      CrossPlatformMachineEpsilon * 10)]  // expected:  (log2(e))
1003         [InlineData( 37.221710484165167,       1.5707963267948966,      CrossPlatformMachineEpsilon * 10)]  // expected:  (pi / 2)
1004         [InlineData( 200.71743249053009,       2.3025850929940457,      CrossPlatformMachineEpsilon * 10)]  // expected:  (ln(10))
1005         [InlineData( 522.73529967043665,       2.7182818284590452,      CrossPlatformMachineEpsilon * 10)]  // expected:  (e)
1006         [InlineData( 1385.4557313670111,       3.1415926535897932,      CrossPlatformMachineEpsilon * 10)]  // expected:  (pi)
1007         [InlineData( double.PositiveInfinity,  double.PositiveInfinity, 0.0)]
Log10(double value, double expectedResult, double allowedVariance)1008         public static void Log10(double value, double expectedResult, double allowedVariance)
1009         {
1010             AssertEqual(expectedResult, Math.Log10(value), allowedVariance);
1011         }
1012 
1013         [Fact]
Max_Byte()1014         public static void Max_Byte()
1015         {
1016             Assert.Equal((byte)3, Math.Max((byte)2, (byte)3));
1017             Assert.Equal(byte.MaxValue, Math.Max(byte.MinValue, byte.MaxValue));
1018         }
1019 
1020         [Fact]
Max_Decimal()1021         public static void Max_Decimal()
1022         {
1023             Assert.Equal(3.0m, Math.Max(-2.0m, 3.0m));
1024             Assert.Equal(decimal.MaxValue, Math.Max(decimal.MinValue, decimal.MaxValue));
1025         }
1026 
1027         [Fact]
Max_Double()1028         public static void Max_Double()
1029         {
1030             Assert.Equal(3.0, Math.Max(3.0, -2.0));
1031             Assert.Equal(double.MaxValue, Math.Max(double.MinValue, double.MaxValue));
1032             Assert.Equal(double.PositiveInfinity, Math.Max(double.NegativeInfinity, double.PositiveInfinity));
1033             Assert.Equal(double.NaN, Math.Max(double.PositiveInfinity, double.NaN));
1034             Assert.Equal(double.NaN, Math.Max(double.NaN, double.NaN));
1035         }
1036 
1037         [Fact]
Max_Int16()1038         public static void Max_Int16()
1039         {
1040             Assert.Equal((short)3, Math.Max((short)(-2), (short)3));
1041             Assert.Equal(short.MaxValue, Math.Max(short.MinValue, short.MaxValue));
1042         }
1043 
1044         [Fact]
Max_Int32()1045         public static void Max_Int32()
1046         {
1047             Assert.Equal(3, Math.Max(-2, 3));
1048             Assert.Equal(int.MaxValue, Math.Max(int.MinValue, int.MaxValue));
1049         }
1050 
1051         [Fact]
Max_Int64()1052         public static void Max_Int64()
1053         {
1054             Assert.Equal(3L, Math.Max(-2L, 3L));
1055             Assert.Equal(long.MaxValue, Math.Max(long.MinValue, long.MaxValue));
1056         }
1057 
1058         [Fact]
Max_SByte()1059         public static void Max_SByte()
1060         {
1061             Assert.Equal((sbyte)3, Math.Max((sbyte)(-2), (sbyte)3));
1062             Assert.Equal(sbyte.MaxValue, Math.Max(sbyte.MinValue, sbyte.MaxValue));
1063         }
1064 
1065         [Fact]
Max_Single()1066         public static void Max_Single()
1067         {
1068             Assert.Equal(3.0f, Math.Max(3.0f, -2.0f));
1069             Assert.Equal(float.MaxValue, Math.Max(float.MinValue, float.MaxValue));
1070             Assert.Equal(float.PositiveInfinity, Math.Max(float.NegativeInfinity, float.PositiveInfinity));
1071             Assert.Equal(float.NaN, Math.Max(float.PositiveInfinity, float.NaN));
1072             Assert.Equal(float.NaN, Math.Max(float.NaN, float.NaN));
1073         }
1074 
1075         [Fact]
Max_UInt16()1076         public static void Max_UInt16()
1077         {
1078             Assert.Equal((ushort)3, Math.Max((ushort)2, (ushort)3));
1079             Assert.Equal(ushort.MaxValue, Math.Max(ushort.MinValue, ushort.MaxValue));
1080         }
1081 
1082         [Fact]
Max_UInt32()1083         public static void Max_UInt32()
1084         {
1085             Assert.Equal((uint)3, Math.Max((uint)2, (uint)3));
1086             Assert.Equal(uint.MaxValue, Math.Max(uint.MinValue, uint.MaxValue));
1087         }
1088 
1089         [Fact]
Max_UInt64()1090         public static void Max_UInt64()
1091         {
1092             Assert.Equal((ulong)3, Math.Max((ulong)2, (ulong)3));
1093             Assert.Equal(ulong.MaxValue, Math.Max(ulong.MinValue, ulong.MaxValue));
1094         }
1095 
1096         [Fact]
Min_Byte()1097         public static void Min_Byte()
1098         {
1099             Assert.Equal((byte)2, Math.Min((byte)3, (byte)2));
1100             Assert.Equal(byte.MinValue, Math.Min(byte.MinValue, byte.MaxValue));
1101         }
1102 
1103         [Fact]
Min_Decimal()1104         public static void Min_Decimal()
1105         {
1106             Assert.Equal(-2.0m, Math.Min(3.0m, -2.0m));
1107             Assert.Equal(decimal.MinValue, Math.Min(decimal.MinValue, decimal.MaxValue));
1108         }
1109 
1110         [Fact]
Min_Double()1111         public static void Min_Double()
1112         {
1113             Assert.Equal(-2.0, Math.Min(3.0, -2.0));
1114             Assert.Equal(double.MinValue, Math.Min(double.MinValue, double.MaxValue));
1115             Assert.Equal(double.NegativeInfinity, Math.Min(double.NegativeInfinity, double.PositiveInfinity));
1116             Assert.Equal(double.NaN, Math.Min(double.NegativeInfinity, double.NaN));
1117             Assert.Equal(double.NaN, Math.Min(double.NaN, double.NaN));
1118         }
1119 
1120         [Fact]
Min_Int16()1121         public static void Min_Int16()
1122         {
1123             Assert.Equal((short)(-2), Math.Min((short)3, (short)(-2)));
1124             Assert.Equal(short.MinValue, Math.Min(short.MinValue, short.MaxValue));
1125         }
1126 
1127         [Fact]
Min_Int32()1128         public static void Min_Int32()
1129         {
1130             Assert.Equal(-2, Math.Min(3, -2));
1131             Assert.Equal(int.MinValue, Math.Min(int.MinValue, int.MaxValue));
1132         }
1133 
1134         [Fact]
Min_Int64()1135         public static void Min_Int64()
1136         {
1137             Assert.Equal(-2L, Math.Min(3L, -2L));
1138             Assert.Equal(long.MinValue, Math.Min(long.MinValue, long.MaxValue));
1139         }
1140 
1141         [Fact]
Min_SByte()1142         public static void Min_SByte()
1143         {
1144             Assert.Equal((sbyte)(-2), Math.Min((sbyte)3, (sbyte)(-2)));
1145             Assert.Equal(sbyte.MinValue, Math.Min(sbyte.MinValue, sbyte.MaxValue));
1146         }
1147 
1148         [Fact]
Min_Single()1149         public static void Min_Single()
1150         {
1151             Assert.Equal(-2.0f, Math.Min(3.0f, -2.0f));
1152             Assert.Equal(float.MinValue, Math.Min(float.MinValue, float.MaxValue));
1153             Assert.Equal(float.NegativeInfinity, Math.Min(float.NegativeInfinity, float.PositiveInfinity));
1154             Assert.Equal(float.NaN, Math.Min(float.NegativeInfinity, float.NaN));
1155             Assert.Equal(float.NaN, Math.Min(float.NaN, float.NaN));
1156         }
1157 
1158         [Fact]
Min_UInt16()1159         public static void Min_UInt16()
1160         {
1161             Assert.Equal((ushort)2, Math.Min((ushort)3, (ushort)2));
1162             Assert.Equal(ushort.MinValue, Math.Min(ushort.MinValue, ushort.MaxValue));
1163         }
1164 
1165         [Fact]
Min_UInt32()1166         public static void Min_UInt32()
1167         {
1168             Assert.Equal((uint)2, Math.Min((uint)3, (uint)2));
1169             Assert.Equal(uint.MinValue, Math.Min(uint.MinValue, uint.MaxValue));
1170         }
1171 
1172         [Fact]
Min_UInt64()1173         public static void Min_UInt64()
1174         {
1175             Assert.Equal((ulong)2, Math.Min((ulong)3, (ulong)2));
1176             Assert.Equal(ulong.MinValue, Math.Min(ulong.MinValue, ulong.MaxValue));
1177         }
1178 
1179         public static IEnumerable<object[]> Pow_TestData
1180         {
1181             get
1182             {
1183                 yield return new object[] { double.NegativeInfinity, double.NegativeInfinity, 0.0, 0.0 };
1184                 yield return new object[] { double.NegativeInfinity, -1.0, -0.0, 0.0 };
1185                 yield return new object[] { double.NegativeInfinity, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1186                 yield return new object[] { double.NegativeInfinity, double.NaN, double.NaN, 0.0 };
1187                 yield return new object[] { double.NegativeInfinity, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1188                 yield return new object[] { double.NegativeInfinity, 1.0, double.NegativeInfinity, 0.0 };
1189                 yield return new object[] { double.NegativeInfinity, double.PositiveInfinity, double.PositiveInfinity, 0.0 };
1190                 yield return new object[] { -10.0, double.NegativeInfinity, 0.0, 0.0 };
1191                 yield return new object[] { -10.0, -1.5707963267948966, double.NaN, 0.0 };                                     //          y: -(pi / 2)
1192                 yield return new object[] { -10.0, -1.0, -0.1, CrossPlatformMachineEpsilon };
1193                 yield return new object[] { -10.0, -0.78539816339744831, double.NaN, 0.0 };                                     //          y: -(pi / 4)
1194                 yield return new object[] { -10.0, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1195                 yield return new object[] { -10.0, double.NaN, double.NaN, 0.0 };
1196                 yield return new object[] { -10.0, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1197                 yield return new object[] { -10.0, 0.78539816339744831, double.NaN, 0.0 };                                     //          y:  (pi / 4)
1198                 yield return new object[] { -10.0, 1.0, -10.0, CrossPlatformMachineEpsilon * 100 };
1199                 yield return new object[] { -10.0, 1.5707963267948966, double.NaN, 0.0 };                                     //          y:  (pi / 2)
1200                 yield return new object[] { -10.0, double.PositiveInfinity, double.PositiveInfinity, 0.0 };
1201                 yield return new object[] { -2.7182818284590452, double.NegativeInfinity, 0.0, 0.0 };                                     // x: -(e)
1202                 yield return new object[] { -2.7182818284590452, -1.5707963267948966, double.NaN, 0.0 };                                     // x: -(e)  y: -(pi / 2)
1203                 yield return new object[] { -2.7182818284590452, -1.0, -0.36787944117144232, CrossPlatformMachineEpsilon };             // x: -(e)
1204                 yield return new object[] { -2.7182818284590452, -0.78539816339744831, double.NaN, 0.0 };                                     // x: -(e)  y: -(pi / 4)
1205                 yield return new object[] { -2.7182818284590452, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };        // x: -(e)
1206                 yield return new object[] { -2.7182818284590452, double.NaN, double.NaN, 0.0 };
1207                 yield return new object[] { -2.7182818284590452, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };        // x: -(e)
1208                 yield return new object[] { -2.7182818284590452, 0.78539816339744831, double.NaN, 0.0 };                                     // x: -(e)  y:  (pi / 4)
1209                 yield return new object[] { -2.7182818284590452, 1.0, -2.7182818284590452, CrossPlatformMachineEpsilon * 10 };        // x: -(e)  expected: (e)
1210                 yield return new object[] { -2.7182818284590452, 1.5707963267948966, double.NaN, 0.0 };                                     // x: -(e)  y:  (pi / 2)
1211                 yield return new object[] { -2.7182818284590452, double.PositiveInfinity, double.PositiveInfinity, 0.0 };
1212                 yield return new object[] { -1.0, -1.0, -1.0, CrossPlatformMachineEpsilon * 10 };
1213                 yield return new object[] { -1.0, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1214                 yield return new object[] { -1.0, double.NaN, double.NaN, 0.0 };
1215                 yield return new object[] { -1.0, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1216                 yield return new object[] { -1.0, 1.0, -1.0, CrossPlatformMachineEpsilon * 10 };
1217                 yield return new object[] { -0.0, double.NegativeInfinity, double.PositiveInfinity, 0.0 };
1218                 yield return new object[] { -0.0, -3.0, double.NegativeInfinity, 0.0 };
1219                 yield return new object[] { -0.0, -2.0, double.PositiveInfinity, 0.0 };
1220                 yield return new object[] { -0.0, -1.5707963267948966, double.PositiveInfinity, 0.0 };                                     //          y: -(pi / 2)
1221                 yield return new object[] { -0.0, -1.0, double.NegativeInfinity, 0.0 };
1222                 yield return new object[] { -0.0, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1223                 yield return new object[] { -0.0, double.NaN, double.NaN, 0.0 };
1224                 yield return new object[] { -0.0, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1225                 yield return new object[] { -0.0, 1.0, -0.0, 0.0 };
1226                 yield return new object[] { -0.0, 1.5707963267948966, 0.0, 0.0 };                                     //          y: -(pi / 2)
1227                 yield return new object[] { -0.0, 2.0, 0.0, 0.0 };
1228                 yield return new object[] { -0.0, 3.0, -0.0, 0.0 };
1229                 yield return new object[] { -0.0, double.PositiveInfinity, 0.0, 0.0 };
1230                 yield return new object[] { double.NaN, double.NegativeInfinity, double.NaN, 0.0 };
1231                 yield return new object[] { double.NaN, -1.0, double.NaN, 0.0 };
1232                 yield return new object[] { double.NaN, double.NaN, double.NaN, 0.0 };
1233                 yield return new object[] { double.NaN, 1.0, double.NaN, 0.0 };
1234                 yield return new object[] { double.NaN, double.PositiveInfinity, double.NaN, 0.0 };
1235                 yield return new object[] { 0.0, double.NegativeInfinity, double.PositiveInfinity, 0.0 };
1236                 yield return new object[] { 0.0, -3.0, double.PositiveInfinity, 0.0 };
1237                 yield return new object[] { 0.0, -2.0, double.PositiveInfinity, 0.0 };
1238                 yield return new object[] { 0.0, -1.5707963267948966, double.PositiveInfinity, 0.0 };                                     //          y: -(pi / 2)
1239                 yield return new object[] { 0.0, -1.0, double.PositiveInfinity, 0.0 };
1240                 yield return new object[] { 0.0, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1241                 yield return new object[] { 0.0, double.NaN, double.NaN, 0.0 };
1242                 yield return new object[] { 0.0, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1243                 yield return new object[] { 0.0, 1.0, 0.0, 0.0 };
1244                 yield return new object[] { 0.0, 1.5707963267948966, 0.0, 0.0 };                                     //          y: -(pi / 2)
1245                 yield return new object[] { 0.0, 2.0, 0.0, 0.0 };
1246                 yield return new object[] { 0.0, 3.0, 0.0, 0.0 };
1247                 yield return new object[] { 0.0, double.PositiveInfinity, 0.0, 0.0 };
1248                 yield return new object[] { 1.0, double.NegativeInfinity, 1.0, CrossPlatformMachineEpsilon * 10 };
1249                 yield return new object[] { 1.0, -1.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1250                 yield return new object[] { 1.0, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1251                 yield return new object[] { 1.0, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1252                 yield return new object[] { 1.0, 1.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1253                 yield return new object[] { 1.0, double.PositiveInfinity, 1.0, CrossPlatformMachineEpsilon * 10 };
1254                 yield return new object[] { 2.7182818284590452, double.NegativeInfinity, 0.0, 0.0 };
1255                 yield return new object[] { 2.7182818284590452, -3.1415926535897932, 0.043213918263772250, CrossPlatformMachineEpsilon / 10 };        // x:  (e)  y: -(pi)
1256                 yield return new object[] { 2.7182818284590452, -2.7182818284590452, 0.065988035845312537, CrossPlatformMachineEpsilon / 10 };        // x:  (e)  y: -(e)
1257                 yield return new object[] { 2.7182818284590452, -2.3025850929940457, 0.1, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(ln(10))
1258                 yield return new object[] { 2.7182818284590452, -1.5707963267948966, 0.20787957635076191, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(pi / 2)
1259                 yield return new object[] { 2.7182818284590452, -1.4426950408889634, 0.23629008834452270, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(log2(e))
1260                 yield return new object[] { 2.7182818284590452, -1.4142135623730950, 0.24311673443421421, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(sqrt(2))
1261                 yield return new object[] { 2.7182818284590452, -1.1283791670955126, 0.32355726390307110, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(2 / sqrt(pi))
1262                 yield return new object[] { 2.7182818284590452, -1.0, 0.36787944117144232, CrossPlatformMachineEpsilon };             // x:  (e)
1263                 yield return new object[] { 2.7182818284590452, -0.78539816339744831, 0.45593812776599624, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(pi / 4)
1264                 yield return new object[] { 2.7182818284590452, -0.70710678118654752, 0.49306869139523979, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(1 / sqrt(2))
1265                 yield return new object[] { 2.7182818284590452, -0.69314718055994531, 0.5, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(ln(2))
1266                 yield return new object[] { 2.7182818284590452, -0.63661977236758134, 0.52907780826773535, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(2 / pi)
1267                 yield return new object[] { 2.7182818284590452, -0.43429448190325183, 0.64772148514180065, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(log10(e))
1268                 yield return new object[] { 2.7182818284590452, -0.31830988618379067, 0.72737734929521647, CrossPlatformMachineEpsilon };             // x:  (e)  y: -(1 / pi)
1269                 yield return new object[] { 2.7182818284590452, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };        // x:  (e)
1270                 yield return new object[] { 2.7182818284590452, double.NaN, double.NaN, 0.0 };
1271                 yield return new object[] { 2.7182818284590452, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };        // x:  (e)
1272                 yield return new object[] { 2.7182818284590452, 0.31830988618379067, 1.3748022274393586, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (1 / pi)
1273                 yield return new object[] { 2.7182818284590452, 0.43429448190325183, 1.5438734439711811, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (log10(e))
1274                 yield return new object[] { 2.7182818284590452, 0.63661977236758134, 1.8900811645722220, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (2 / pi)
1275                 yield return new object[] { 2.7182818284590452, 0.69314718055994531, 2.0, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (ln(2))
1276                 yield return new object[] { 2.7182818284590452, 0.70710678118654752, 2.0281149816474725, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (1 / sqrt(2))
1277                 yield return new object[] { 2.7182818284590452, 0.78539816339744831, 2.1932800507380155, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (pi / 4)
1278                 yield return new object[] { 2.7182818284590452, 1.0, 2.7182818284590452, CrossPlatformMachineEpsilon * 10 };        // x:  (e)                      expected: (e)
1279                 yield return new object[] { 2.7182818284590452, 1.1283791670955126, 3.0906430223107976, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (2 / sqrt(pi))
1280                 yield return new object[] { 2.7182818284590452, 1.4142135623730950, 4.1132503787829275, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (sqrt(2))
1281                 yield return new object[] { 2.7182818284590452, 1.4426950408889634, 4.2320861065570819, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (log2(e))
1282                 yield return new object[] { 2.7182818284590452, 1.5707963267948966, 4.8104773809653517, CrossPlatformMachineEpsilon * 10 };        // x:  (e)  y:  (pi / 2)
1283                 yield return new object[] { 2.7182818284590452, 2.3025850929940457, 10.0, CrossPlatformMachineEpsilon * 100 };       // x:  (e)  y:  (ln(10))
1284                 yield return new object[] { 2.7182818284590452, 2.7182818284590452, 15.154262241479264, CrossPlatformMachineEpsilon * 100 };       // x:  (e)  y:  (e)
1285                 yield return new object[] { 2.7182818284590452, 3.1415926535897932, 23.140692632779269, CrossPlatformMachineEpsilon * 100 };       // x:  (e)  y:  (pi)
1286                 yield return new object[] { 2.7182818284590452, double.PositiveInfinity, double.PositiveInfinity, 0.0 };                                     // x:  (e)
1287                 yield return new object[] { 10.0, double.NegativeInfinity, 0.0, 0.0 };
1288                 yield return new object[] { 10.0, -3.1415926535897932, 0.00072178415907472774, CrossPlatformMachineEpsilon / 1000 };      //          y: -(pi)
1289                 yield return new object[] { 10.0, -2.7182818284590452, 0.0019130141022243176, CrossPlatformMachineEpsilon / 100 };       //          y: -(e)
1290                 yield return new object[] { 10.0, -2.3025850929940457, 0.0049821282964407206, CrossPlatformMachineEpsilon / 100 };       //          y: -(ln(10))
1291                 yield return new object[] { 10.0, -1.5707963267948966, 0.026866041001136132, CrossPlatformMachineEpsilon / 10 };        //          y: -(pi / 2)
1292                 yield return new object[] { 10.0, -1.4426950408889634, 0.036083192820787210, CrossPlatformMachineEpsilon / 10 };        //          y: -(log2(e))
1293                 yield return new object[] { 10.0, -1.4142135623730950, 0.038528884700322026, CrossPlatformMachineEpsilon / 10 };        //          y: -(sqrt(2))
1294                 yield return new object[] { 10.0, -1.1283791670955126, 0.074408205860642723, CrossPlatformMachineEpsilon / 10 };        //          y: -(2 / sqrt(pi))
1295                 yield return new object[] { 10.0, -1.0, 0.1, CrossPlatformMachineEpsilon };
1296                 yield return new object[] { 10.0, -0.78539816339744831, 0.16390863613957665, CrossPlatformMachineEpsilon };             //          y: -(pi / 4)
1297                 yield return new object[] { 10.0, -0.70710678118654752, 0.19628775993505562, CrossPlatformMachineEpsilon };             //          y: -(1 / sqrt(2))
1298                 yield return new object[] { 10.0, -0.69314718055994531, 0.20269956628651730, CrossPlatformMachineEpsilon };             //          y: -(ln(2))
1299                 yield return new object[] { 10.0, -0.63661977236758134, 0.23087676451600055, CrossPlatformMachineEpsilon };             //          y: -(2 / pi)
1300                 yield return new object[] { 10.0, -0.43429448190325183, 0.36787944117144232, CrossPlatformMachineEpsilon };             //          y: -(log10(e))
1301                 yield return new object[] { 10.0, -0.31830988618379067, 0.48049637305186868, CrossPlatformMachineEpsilon };             //          y: -(1 / pi)
1302                 yield return new object[] { 10.0, -0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1303                 yield return new object[] { 10.0, double.NaN, double.NaN, 0.0 };
1304                 yield return new object[] { 10.0, 0.0, 1.0, CrossPlatformMachineEpsilon * 10 };
1305                 yield return new object[] { 10.0, 0.31830988618379067, 2.0811811619898573, CrossPlatformMachineEpsilon * 10 };        //          y:  (1 / pi)
1306                 yield return new object[] { 10.0, 0.43429448190325183, 2.7182818284590452, CrossPlatformMachineEpsilon * 10 };        //          y:  (log10(e))      expected: (e)
1307                 yield return new object[] { 10.0, 0.63661977236758134, 4.3313150290214525, CrossPlatformMachineEpsilon * 10 };        //          y:  (2 / pi)
1308                 yield return new object[] { 10.0, 0.69314718055994531, 4.9334096679145963, CrossPlatformMachineEpsilon * 10 };        //          y:  (ln(2))
1309                 yield return new object[] { 10.0, 0.70710678118654752, 5.0945611704512962, CrossPlatformMachineEpsilon * 10 };        //          y:  (1 / sqrt(2))
1310                 yield return new object[] { 10.0, 0.78539816339744831, 6.1009598002416937, CrossPlatformMachineEpsilon * 10 };        //          y:  (pi / 4)
1311                 yield return new object[] { 10.0, 1.0, 10.0, CrossPlatformMachineEpsilon * 100 };
1312                 yield return new object[] { 10.0, 1.1283791670955126, 13.439377934644400, CrossPlatformMachineEpsilon * 100 };       //          y:  (2 / sqrt(pi))
1313                 yield return new object[] { 10.0, 1.4142135623730950, 25.954553519470081, CrossPlatformMachineEpsilon * 100 };       //          y:  (sqrt(2))
1314                 yield return new object[] { 10.0, 1.4426950408889634, 27.713733786437790, CrossPlatformMachineEpsilon * 100 };       //          y:  (log2(e))
1315                 yield return new object[] { 10.0, 1.5707963267948966, 37.221710484165167, CrossPlatformMachineEpsilon * 100 };       //          y:  (pi / 2)
1316                 yield return new object[] { 10.0, 2.3025850929940457, 200.71743249053009, CrossPlatformMachineEpsilon * 1000 };      //          y:  (ln(10))
1317                 yield return new object[] { 10.0, 2.7182818284590452, 522.73529967043665, CrossPlatformMachineEpsilon * 1000 };      //          y:  (e)
1318                 yield return new object[] { 10.0, 3.1415926535897932, 1385.4557313670111, CrossPlatformMachineEpsilon * 10000 };     //          y:  (pi)
1319                 yield return new object[] { 10.0, double.PositiveInfinity, double.PositiveInfinity, 0.0 };
1320                 yield return new object[] { double.PositiveInfinity, double.NegativeInfinity, 0.0, 0.0 };
1321                 yield return new object[] { double.PositiveInfinity, -1.0, 0.0, 0.0 };
1322                 yield return new object[] { double.PositiveInfinity, -0.0, 1.0, 0.0 };
1323                 yield return new object[] { double.PositiveInfinity, double.NaN, double.NaN, 0.0 };
1324                 yield return new object[] { double.PositiveInfinity, 0.0, 1.0, 0.0 };
1325                 yield return new object[] { double.PositiveInfinity, 1.0, double.PositiveInfinity, 0.0 };
1326                 yield return new object[] { double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity, 0.0 };
1327             }
1328         }
1329 
1330         [Theory]
1331         [MemberData(nameof(Pow_TestData))]
Pow(double x, double y, double expectedResult, double allowedVariance)1332         public static void Pow(double x, double y, double expectedResult, double allowedVariance)
1333         {
1334             AssertEqual(expectedResult, Math.Pow(x, y), allowedVariance);
1335         }
1336 
1337         [Theory]
1338         [InlineData(-1.0,         double.NegativeInfinity, 1.0, CrossPlatformMachineEpsilon * 10)]
1339         [InlineData(-1.0,         double.PositiveInfinity, 1.0, CrossPlatformMachineEpsilon * 10)]
1340         [InlineData( double.NaN, -0.0,                     1.0, CrossPlatformMachineEpsilon * 10)]
1341         [InlineData( double.NaN,  0.0,                     1.0, CrossPlatformMachineEpsilon * 10)]
1342         [InlineData( 1.0,         double.NaN,              1.0, CrossPlatformMachineEpsilon * 10)]
1343         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
Pow_IEEE(float x, float y, float expectedResult, float allowedVariance)1344         public static void Pow_IEEE(float x, float y, float expectedResult, float allowedVariance)
1345         {
1346             AssertEqual(expectedResult, Math.Pow(x, y), allowedVariance);
1347         }
1348 
1349         [Theory]
1350         [InlineData(-1.0,         double.NegativeInfinity, double.NaN, 0.0)]
1351         [InlineData(-1.0,         double.PositiveInfinity, double.NaN, 0.0)]
1352         [InlineData( double.NaN, -0.0,                     double.NaN, 0.0)]
1353         [InlineData( double.NaN,  0.0,                     double.NaN, 0.0)]
1354         [InlineData( 1.0,         double.NaN,              double.NaN, 0.0)]
1355         [SkipOnTargetFramework(~TargetFrameworkMonikers.NetFramework)]
Pow_IEEE_Legacy(float x, float y, float expectedResult, float allowedVariance)1356         public static void Pow_IEEE_Legacy(float x, float y, float expectedResult, float allowedVariance)
1357         {
1358             AssertEqual(expectedResult, Math.Pow(x, y), allowedVariance);
1359         }
1360 
1361         [Fact]
Round_Decimal()1362         public static void Round_Decimal()
1363         {
1364             Assert.Equal(0.0m, Math.Round(0.0m));
1365             Assert.Equal(1.0m, Math.Round(1.4m));
1366             Assert.Equal(2.0m, Math.Round(1.5m));
1367             Assert.Equal(2e16m, Math.Round(2e16m));
1368             Assert.Equal(0.0m, Math.Round(-0.0m));
1369             Assert.Equal(-1.0m, Math.Round(-1.4m));
1370             Assert.Equal(-2.0m, Math.Round(-1.5m));
1371             Assert.Equal(-2e16m, Math.Round(-2e16m));
1372         }
1373 
1374         [Fact]
Round_Decimal_Digits()1375         public static void Round_Decimal_Digits()
1376         {
1377             Assert.Equal(3.422m, Math.Round(3.42156m, 3, MidpointRounding.AwayFromZero));
1378             Assert.Equal(-3.422m, Math.Round(-3.42156m, 3, MidpointRounding.AwayFromZero));
1379             Assert.Equal(decimal.Zero, Math.Round(decimal.Zero, 3, MidpointRounding.AwayFromZero));
1380         }
1381 
1382         [Fact]
Round_Double()1383         public static void Round_Double()
1384         {
1385             Assert.Equal(0.0, Math.Round(0.0));
1386             Assert.Equal(1.0, Math.Round(1.4));
1387             Assert.Equal(2.0, Math.Round(1.5));
1388             Assert.Equal(2e16, Math.Round(2e16));
1389             Assert.Equal(0.0, Math.Round(-0.0));
1390             Assert.Equal(-1.0, Math.Round(-1.4));
1391             Assert.Equal(-2.0, Math.Round(-1.5));
1392             Assert.Equal(-2e16, Math.Round(-2e16));
1393         }
1394 
1395         [Fact]
Round_Double_Digits()1396         public static void Round_Double_Digits()
1397         {
1398             Assert.Equal(3.422, Math.Round(3.42156, 3, MidpointRounding.AwayFromZero), 10);
1399             Assert.Equal(-3.422, Math.Round(-3.42156, 3, MidpointRounding.AwayFromZero), 10);
1400             Assert.Equal(0.0, Math.Round(0.0, 3, MidpointRounding.AwayFromZero));
1401             Assert.Equal(double.NaN, Math.Round(double.NaN, 3, MidpointRounding.AwayFromZero));
1402             Assert.Equal(double.PositiveInfinity, Math.Round(double.PositiveInfinity, 3, MidpointRounding.AwayFromZero));
1403             Assert.Equal(double.NegativeInfinity, Math.Round(double.NegativeInfinity, 3, MidpointRounding.AwayFromZero));
1404         }
1405 
1406         [Fact]
Sign_Decimal()1407         public static void Sign_Decimal()
1408         {
1409             Assert.Equal(0, Math.Sign(0.0m));
1410             Assert.Equal(0, Math.Sign(-0.0m));
1411             Assert.Equal(-1, Math.Sign(-3.14m));
1412             Assert.Equal(1, Math.Sign(3.14m));
1413         }
1414 
1415         [Fact]
Sign_Double()1416         public static void Sign_Double()
1417         {
1418             Assert.Equal(0, Math.Sign(0.0));
1419             Assert.Equal(0, Math.Sign(-0.0));
1420             Assert.Equal(-1, Math.Sign(-3.14));
1421             Assert.Equal(1, Math.Sign(3.14));
1422             Assert.Equal(-1, Math.Sign(double.NegativeInfinity));
1423             Assert.Equal(1, Math.Sign(double.PositiveInfinity));
1424             Assert.Throws<ArithmeticException>(() => Math.Sign(double.NaN));
1425         }
1426 
1427         [Fact]
Sign_Int16()1428         public static void Sign_Int16()
1429         {
1430             Assert.Equal(0, Math.Sign((short)0));
1431             Assert.Equal(-1, Math.Sign((short)(-3)));
1432             Assert.Equal(1, Math.Sign((short)3));
1433         }
1434 
1435         [Fact]
Sign_Int32()1436         public static void Sign_Int32()
1437         {
1438             Assert.Equal(0, Math.Sign(0));
1439             Assert.Equal(-1, Math.Sign(-3));
1440             Assert.Equal(1, Math.Sign(3));
1441         }
1442 
1443         [Fact]
Sign_Int64()1444         public static void Sign_Int64()
1445         {
1446             Assert.Equal(0, Math.Sign(0));
1447             Assert.Equal(-1, Math.Sign(-3));
1448             Assert.Equal(1, Math.Sign(3));
1449         }
1450 
1451         [Fact]
Sign_SByte()1452         public static void Sign_SByte()
1453         {
1454             Assert.Equal(0, Math.Sign((sbyte)0));
1455             Assert.Equal(-1, Math.Sign((sbyte)(-3)));
1456             Assert.Equal(1, Math.Sign((sbyte)3));
1457         }
1458 
1459         [Fact]
Sign_Single()1460         public static void Sign_Single()
1461         {
1462             Assert.Equal(0, Math.Sign(0.0f));
1463             Assert.Equal(0, Math.Sign(-0.0f));
1464             Assert.Equal(-1, Math.Sign(-3.14f));
1465             Assert.Equal(1, Math.Sign(3.14f));
1466             Assert.Equal(-1, Math.Sign(float.NegativeInfinity));
1467             Assert.Equal(1, Math.Sign(float.PositiveInfinity));
1468             Assert.Throws<ArithmeticException>(() => Math.Sign(float.NaN));
1469         }
1470 
1471         [Theory]
1472         [InlineData( double.NegativeInfinity,  double.NaN,          0.0)]
1473         [InlineData(-3.1415926535897932,      -0.0,                 CrossPlatformMachineEpsilon)]       // value: -(pi)
1474         [InlineData(-2.7182818284590452,      -0.41078129050290870, CrossPlatformMachineEpsilon)]       // value: -(e)
1475         [InlineData(-2.3025850929940457,      -0.74398033695749319, CrossPlatformMachineEpsilon)]       // value: -(ln(10))
1476         [InlineData(-1.5707963267948966,      -1.0,                 CrossPlatformMachineEpsilon * 10)]  // value: -(pi / 2)
1477         [InlineData(-1.4426950408889634,      -0.99180624439366372, CrossPlatformMachineEpsilon)]       // value: -(log2(e))
1478         [InlineData(-1.4142135623730950,      -0.98776594599273553, CrossPlatformMachineEpsilon)]       // value: -(sqrt(2))
1479         [InlineData(-1.1283791670955126,      -0.90371945743584630, CrossPlatformMachineEpsilon)]       // value: -(2 / sqrt(pi))
1480         [InlineData(-1.0,                     -0.84147098480789651, CrossPlatformMachineEpsilon)]
1481         [InlineData(-0.78539816339744831,     -0.70710678118654752, CrossPlatformMachineEpsilon)]       // value: -(pi / 4),        expected: -(1 / sqrt(2))
1482         [InlineData(-0.70710678118654752,     -0.64963693908006244, CrossPlatformMachineEpsilon)]       // value: -(1 / sqrt(2))
1483         [InlineData(-0.69314718055994531,     -0.63896127631363480, CrossPlatformMachineEpsilon)]       // value: -(ln(2))
1484         [InlineData(-0.63661977236758134,     -0.59448076852482208, CrossPlatformMachineEpsilon)]       // value: -(2 / pi)
1485         [InlineData(-0.43429448190325183,     -0.42077048331375735, CrossPlatformMachineEpsilon)]       // value: -(log10(e))
1486         [InlineData(-0.31830988618379067,     -0.31296179620778659, CrossPlatformMachineEpsilon)]       // value: -(1 / pi)
1487         [InlineData(-0.0,                     -0.0,                 0.0)]
1488         [InlineData( double.NaN,               double.NaN,          0.0)]
1489         [InlineData( 0.0,                      0.0,                 0.0)]
1490         [InlineData( 0.31830988618379067,      0.31296179620778659, CrossPlatformMachineEpsilon)]       // value:  (1 / pi)
1491         [InlineData( 0.43429448190325183,      0.42077048331375735, CrossPlatformMachineEpsilon)]       // value:  (log10(e))
1492         [InlineData( 0.63661977236758134,      0.59448076852482208, CrossPlatformMachineEpsilon)]       // value:  (2 / pi)
1493         [InlineData( 0.69314718055994531,      0.63896127631363480, CrossPlatformMachineEpsilon)]       // value:  (ln(2))
1494         [InlineData( 0.70710678118654752,      0.64963693908006244, CrossPlatformMachineEpsilon)]       // value:  (1 / sqrt(2))
1495         [InlineData( 0.78539816339744831,      0.70710678118654752, CrossPlatformMachineEpsilon)]       // value:  (pi / 4),        expected:  (1 / sqrt(2))
1496         [InlineData( 1.0,                      0.84147098480789651, CrossPlatformMachineEpsilon)]
1497         [InlineData( 1.1283791670955126,       0.90371945743584630, CrossPlatformMachineEpsilon)]       // value:  (2 / sqrt(pi))
1498         [InlineData( 1.4142135623730950,       0.98776594599273553, CrossPlatformMachineEpsilon)]       // value:  (sqrt(2))
1499         [InlineData( 1.4426950408889634,       0.99180624439366372, CrossPlatformMachineEpsilon)]       // value:  (log2(e))
1500         [InlineData( 1.5707963267948966,       1.0,                 CrossPlatformMachineEpsilon * 10)]  // value:  (pi / 2)
1501         [InlineData( 2.3025850929940457,       0.74398033695749319, CrossPlatformMachineEpsilon)]       // value:  (ln(10))
1502         [InlineData( 2.7182818284590452,       0.41078129050290870, CrossPlatformMachineEpsilon)]       // value:  (e)
1503         [InlineData( 3.1415926535897932,       0.0,                 CrossPlatformMachineEpsilon)]       // value:  (pi)
1504         [InlineData( double.PositiveInfinity,  double.NaN,          0.0)]
Sin(double value, double expectedResult, double allowedVariance)1505         public static void Sin(double value, double expectedResult, double allowedVariance)
1506         {
1507             AssertEqual(expectedResult, Math.Sin(value), allowedVariance);
1508         }
1509 
1510         [Theory]
1511         [InlineData( double.NegativeInfinity,  double.NegativeInfinity, 0.0)]
1512         [InlineData(-3.1415926535897932,      -11.548739357257748,      CrossPlatformMachineEpsilon * 100)]     // value: -(pi)
1513         [InlineData(-2.7182818284590452,      -7.5441371028169758,      CrossPlatformMachineEpsilon * 10)]      // value: -(e)
1514         [InlineData(-2.3025850929940457,      -4.95,                    CrossPlatformMachineEpsilon * 10)]      // value: -(ln(10))
1515         [InlineData(-1.5707963267948966,      -2.3012989023072949,      CrossPlatformMachineEpsilon * 10)]      // value: -(pi / 2)
1516         [InlineData(-1.4426950408889634,      -1.9978980091062796,      CrossPlatformMachineEpsilon * 10)]      // value: -(log2(e))
1517         [InlineData(-1.4142135623730950,      -1.9350668221743567,      CrossPlatformMachineEpsilon * 10)]      // value: -(sqrt(2))
1518         [InlineData(-1.1283791670955126,      -1.3835428792038633,      CrossPlatformMachineEpsilon * 10)]      // value: -(2 / sqrt(pi))
1519         [InlineData(-1.0,                     -1.1752011936438015,      CrossPlatformMachineEpsilon * 10)]
1520         [InlineData(-0.78539816339744831,     -0.86867096148600961,     CrossPlatformMachineEpsilon)]           // value: -(pi / 4)
1521         [InlineData(-0.70710678118654752,     -0.76752314512611633,     CrossPlatformMachineEpsilon)]           // value: -(1 / sqrt(2))
1522         [InlineData(-0.69314718055994531,     -0.75,                    CrossPlatformMachineEpsilon)]           // value: -(ln(2))
1523         [InlineData(-0.63661977236758134,     -0.68050167815224332,     CrossPlatformMachineEpsilon)]           // value: -(2 / pi)
1524         [InlineData(-0.43429448190325183,     -0.44807597941469025,     CrossPlatformMachineEpsilon)]           // value: -(log10(e))
1525         [InlineData(-0.31830988618379067,     -0.32371243907207108,     CrossPlatformMachineEpsilon)]           // value: -(1 / pi)
1526         [InlineData(-0.0,                     -0.0,                     0.0)]
1527         [InlineData( double.NaN,               double.NaN,              0.0)]
1528         [InlineData( 0.0,                      0.0,                     0.0)]
1529         [InlineData( 0.31830988618379067,      0.32371243907207108,     CrossPlatformMachineEpsilon)]           // value:  (1 / pi)
1530         [InlineData( 0.43429448190325183,      0.44807597941469025,     CrossPlatformMachineEpsilon)]           // value:  (log10(e))
1531         [InlineData( 0.63661977236758134,      0.68050167815224332,     CrossPlatformMachineEpsilon)]           // value:  (2 / pi)
1532         [InlineData( 0.69314718055994531,      0.75,                    CrossPlatformMachineEpsilon)]           // value:  (ln(2))
1533         [InlineData( 0.70710678118654752,      0.76752314512611633,     CrossPlatformMachineEpsilon)]           // value:  (1 / sqrt(2))
1534         [InlineData( 0.78539816339744831,      0.86867096148600961,     CrossPlatformMachineEpsilon)]           // value:  (pi / 4)
1535         [InlineData( 1.0,                      1.1752011936438015,      CrossPlatformMachineEpsilon * 10)]
1536         [InlineData( 1.1283791670955126,       1.3835428792038633,      CrossPlatformMachineEpsilon * 10)]      // value:  (2 / sqrt(pi))
1537         [InlineData( 1.4142135623730950,       1.9350668221743567,      CrossPlatformMachineEpsilon * 10)]      // value:  (sqrt(2))
1538         [InlineData( 1.4426950408889634,       1.9978980091062796,      CrossPlatformMachineEpsilon * 10)]      // value:  (log2(e))
1539         [InlineData( 1.5707963267948966,       2.3012989023072949,      CrossPlatformMachineEpsilon * 10)]      // value:  (pi / 2)
1540         [InlineData( 2.3025850929940457,       4.95,                    CrossPlatformMachineEpsilon * 10)]      // value:  (ln(10))
1541         [InlineData( 2.7182818284590452,       7.5441371028169758,      CrossPlatformMachineEpsilon * 10)]      // value:  (e)
1542         [InlineData( 3.1415926535897932,       11.548739357257748,      CrossPlatformMachineEpsilon * 100)]     // value:  (pi)
1543         [InlineData( double.PositiveInfinity,  double.PositiveInfinity, 0.0)]
Sinh(double value, double expectedResult, double allowedVariance)1544         public static void Sinh(double value, double expectedResult, double allowedVariance)
1545         {
1546             AssertEqual(expectedResult, Math.Sinh(value), allowedVariance);
1547         }
1548 
1549         [Theory]
1550         [InlineData( double.NegativeInfinity,  double.NaN,             0.0)]
1551         [InlineData(-3.1415926535897932,       double.NaN,             0.0)]                                 // value: (pi)
1552         [InlineData(-2.7182818284590452,       double.NaN,             0.0)]                                 // value: (e)
1553         [InlineData(-2.3025850929940457,       double.NaN,             0.0)]                                 // value: (ln(10))
1554         [InlineData(-1.5707963267948966,       double.NaN,             0.0)]                                 // value: (pi / 2)
1555         [InlineData(-1.4426950408889634,       double.NaN,             0.0)]                                 // value: (log2(e))
1556         [InlineData(-1.4142135623730950,       double.NaN,             0.0)]                                 // value: (sqrt(2))
1557         [InlineData(-1.1283791670955126,       double.NaN,             0.0)]                                 // value: (2 / sqrt(pi))
1558         [InlineData(-1.0,                      double.NaN,             0.0)]
1559         [InlineData(-0.78539816339744831,      double.NaN,             0.0)]                                 // value: (pi / 4)
1560         [InlineData(-0.70710678118654752,      double.NaN,             0.0)]                                 // value: (1 / sqrt(2))
1561         [InlineData(-0.69314718055994531,      double.NaN,             0.0)]                                 // value: (ln(2))
1562         [InlineData(-0.63661977236758134,      double.NaN,             0.0)]                                 // value: (2 / pi)
1563         [InlineData(-0.43429448190325183,      double.NaN,             0.0)]                                 // value: (log10(e))
1564         [InlineData(-0.31830988618379067,      double.NaN,             0.0)]                                 // value: (1 / pi)
1565         [InlineData(-0.0,                     -0.0,                    0.0)]
1566         [InlineData( double.NaN,               double.NaN,             0.0)]
1567         [InlineData( 0.0,                      0.0,                    0.0)]
1568         [InlineData( 0.31830988618379067,      0.56418958354775629,    CrossPlatformMachineEpsilon)]        // value: (1 / pi)
1569         [InlineData( 0.43429448190325183,      0.65901022898226081,    CrossPlatformMachineEpsilon)]        // value: (log10(e))
1570         [InlineData( 0.63661977236758134,      0.79788456080286536,    CrossPlatformMachineEpsilon)]        // value: (2 / pi)
1571         [InlineData( 0.69314718055994531,      0.83255461115769776,    CrossPlatformMachineEpsilon)]        // value: (ln(2))
1572         [InlineData( 0.70710678118654752,      0.84089641525371454,    CrossPlatformMachineEpsilon)]        // value: (1 / sqrt(2))
1573         [InlineData( 0.78539816339744831,      0.88622692545275801,    CrossPlatformMachineEpsilon)]        // value: (pi / 4)
1574         [InlineData( 1.0,                      1.0,                    CrossPlatformMachineEpsilon * 10)]
1575         [InlineData( 1.1283791670955126,       1.0622519320271969,     CrossPlatformMachineEpsilon * 10)]   // value: (2 / sqrt(pi))
1576         [InlineData( 1.4142135623730950,       1.1892071150027211,     CrossPlatformMachineEpsilon * 10)]   // value: (sqrt(2))
1577         [InlineData( 1.4426950408889634,       1.2011224087864498,     CrossPlatformMachineEpsilon * 10)]   // value: (log2(e))
1578         [InlineData( 1.5707963267948966,       1.2533141373155003,     CrossPlatformMachineEpsilon * 10)]   // value: (pi / 2)
1579         [InlineData( 2.3025850929940457,       1.5174271293851464,     CrossPlatformMachineEpsilon * 10)]   // value: (ln(10))
1580         [InlineData( 2.7182818284590452,       1.6487212707001281,     CrossPlatformMachineEpsilon * 10)]   // value: (e)
1581         [InlineData( 3.1415926535897932,       1.7724538509055160,     CrossPlatformMachineEpsilon * 10)]   // value: (pi)
1582         [InlineData( double.PositiveInfinity, double.PositiveInfinity, 0.0)]
Sqrt(double value, double expectedResult, double allowedVariance)1583         public static void Sqrt(double value, double expectedResult, double allowedVariance)
1584         {
1585             AssertEqual(expectedResult, Math.Sqrt(value), allowedVariance);
1586         }
1587 
1588         [Theory]
1589         [InlineData( double.NegativeInfinity,  double.NaN,              0.0)]
1590         [InlineData(-3.1415926535897932,      -0.0,                     CrossPlatformMachineEpsilon)]       // value: -(pi)
1591         [InlineData(-2.7182818284590452,       0.45054953406980750,     CrossPlatformMachineEpsilon)]       // value: -(e)
1592         [InlineData(-2.3025850929940457,       1.1134071468135374,      CrossPlatformMachineEpsilon * 10)]  // value: -(ln(10))
1593         [InlineData(-1.4426950408889634,      -7.7635756709721848,      CrossPlatformMachineEpsilon * 10)]  // value: -(log2(e))
1594         [InlineData(-1.4142135623730950,      -6.3341191670421916,      CrossPlatformMachineEpsilon * 10)]  // value: -(sqrt(2))
1595         [InlineData(-1.1283791670955126,      -2.1108768356626451,      CrossPlatformMachineEpsilon * 10)]  // value: -(2 / sqrt(pi))
1596         [InlineData(-1.0,                     -1.5574077246549022,      CrossPlatformMachineEpsilon * 10)]
1597         [InlineData(-0.78539816339744831,     -1.0,                     CrossPlatformMachineEpsilon * 10)]  // value: -(pi / 4)
1598         [InlineData(-0.70710678118654752,     -0.85451043200960189,     CrossPlatformMachineEpsilon)]       // value: -(1 / sqrt(2))
1599         [InlineData(-0.69314718055994531,     -0.83064087786078395,     CrossPlatformMachineEpsilon)]       // value: -(ln(2))
1600         [InlineData(-0.63661977236758134,     -0.73930295048660405,     CrossPlatformMachineEpsilon)]       // value: -(2 / pi)
1601         [InlineData(-0.43429448190325183,     -0.46382906716062964,     CrossPlatformMachineEpsilon)]       // value: -(log10(e))
1602         [InlineData(-0.31830988618379067,     -0.32951473309607836,     CrossPlatformMachineEpsilon)]       // value: -(1 / pi)
1603         [InlineData(-0.0,                     -0.0,                     0.0)]
1604         [InlineData( double.NaN,               double.NaN,              0.0)]
1605         [InlineData( 0.0,                      0.0,                     0.0)]
1606         [InlineData( 0.31830988618379067,      0.32951473309607836,     CrossPlatformMachineEpsilon)]       // value:  (1 / pi)
1607         [InlineData( 0.43429448190325183,      0.46382906716062964,     CrossPlatformMachineEpsilon)]       // value:  (log10(e))
1608         [InlineData( 0.63661977236758134,      0.73930295048660405,     CrossPlatformMachineEpsilon)]       // value:  (2 / pi)
1609         [InlineData( 0.69314718055994531,      0.83064087786078395,     CrossPlatformMachineEpsilon)]       // value:  (ln(2))
1610         [InlineData( 0.70710678118654752,      0.85451043200960189,     CrossPlatformMachineEpsilon)]       // value:  (1 / sqrt(2))
1611         [InlineData( 0.78539816339744831,      1.0,                     CrossPlatformMachineEpsilon * 10)]  // value:  (pi / 4)
1612         [InlineData( 1.0,                      1.5574077246549022,      CrossPlatformMachineEpsilon * 10)]
1613         [InlineData( 1.1283791670955126,       2.1108768356626451,      CrossPlatformMachineEpsilon * 10)]  // value:  (2 / sqrt(pi))
1614         [InlineData( 1.4142135623730950,       6.3341191670421916,      CrossPlatformMachineEpsilon * 10)]  // value:  (sqrt(2))
1615         [InlineData( 1.4426950408889634,       7.7635756709721848,      CrossPlatformMachineEpsilon * 10)]  // value:  (log2(e))
1616         [InlineData( 2.3025850929940457,      -1.1134071468135374,      CrossPlatformMachineEpsilon * 10)]  // value:  (ln(10))
1617         [InlineData( 2.7182818284590452,      -0.45054953406980750,     CrossPlatformMachineEpsilon)]       // value:  (e)
1618         [InlineData( 3.1415926535897932,       0.0,                     CrossPlatformMachineEpsilon)]       // value:  (pi)
1619         [InlineData( double.PositiveInfinity,  double.NaN,              0.0)]
Tan(double value, double expectedResult, double allowedVariance)1620         public static void Tan(double value, double expectedResult, double allowedVariance)
1621         {
1622             AssertEqual(expectedResult, Math.Tan(value), allowedVariance);
1623         }
1624 
1625         [Theory]
1626         [InlineData(-1.5707963267948966,      -16331239353195370.0,     0.0)]                               // value: -(pi / 2)
1627         [InlineData( 1.5707963267948966,       16331239353195370.0,     0.0)]                               // value:  (pi / 2)
1628         [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
Tan_PiOver2(double value, double expectedResult, double allowedVariance)1629         public static void Tan_PiOver2(double value, double expectedResult, double allowedVariance)
1630         {
1631             AssertEqual(expectedResult, Math.Tan(value), allowedVariance);
1632         }
1633 
1634         [Theory]
1635         [InlineData(-1.5707963267948966,      -16331778728383844.0,     0.0)]                               // value: -(pi / 2)
1636         [InlineData( 1.5707963267948966,       16331778728383844.0,     0.0)]                               // value:  (pi / 2)
1637         [SkipOnTargetFramework(~TargetFrameworkMonikers.NetFramework)]
Tan_PiOver2_Legacy(double value, double expectedResult, double allowedVariance)1638         public static void Tan_PiOver2_Legacy(double value, double expectedResult, double allowedVariance)
1639         {
1640             AssertEqual(expectedResult, Math.Tan(value), allowedVariance);
1641         }
1642 
1643         [Theory]
1644         [InlineData( double.NegativeInfinity, -1.0,                 CrossPlatformMachineEpsilon * 10)]
1645         [InlineData(-3.1415926535897932,      -0.99627207622074994, CrossPlatformMachineEpsilon)]       // value: -(pi)
1646         [InlineData(-2.7182818284590452,      -0.99132891580059984, CrossPlatformMachineEpsilon)]       // value: -(e)
1647         [InlineData(-2.3025850929940457,      -0.98019801980198020, CrossPlatformMachineEpsilon)]       // value: -(ln(10))
1648         [InlineData(-1.5707963267948966,      -0.91715233566727435, CrossPlatformMachineEpsilon)]       // value: -(pi / 2)
1649         [InlineData(-1.4426950408889634,      -0.89423894585503855, CrossPlatformMachineEpsilon)]       // value: -(log2(e))
1650         [InlineData(-1.4142135623730950,      -0.88838556158566054, CrossPlatformMachineEpsilon)]       // value: -(sqrt(2))
1651         [InlineData(-1.1283791670955126,      -0.81046380599898809, CrossPlatformMachineEpsilon)]       // value: -(2 / sqrt(pi))
1652         [InlineData(-1.0,                     -0.76159415595576489, CrossPlatformMachineEpsilon)]
1653         [InlineData(-0.78539816339744831,     -0.65579420263267244, CrossPlatformMachineEpsilon)]       // value: -(pi / 4)
1654         [InlineData(-0.70710678118654752,     -0.60885936501391381, CrossPlatformMachineEpsilon)]       // value: -(1 / sqrt(2))
1655         [InlineData(-0.69314718055994531,     -0.6,                 CrossPlatformMachineEpsilon)]       // value: -(ln(2))
1656         [InlineData(-0.63661977236758134,     -0.56259360033158334, CrossPlatformMachineEpsilon)]       // value: -(2 / pi)
1657         [InlineData(-0.43429448190325183,     -0.40890401183401433, CrossPlatformMachineEpsilon)]       // value: -(log10(e))
1658         [InlineData(-0.31830988618379067,     -0.30797791269089433, CrossPlatformMachineEpsilon)]       // value: -(1 / pi)
1659         [InlineData(-0.0,                     -0.0,                 0.0)]
1660         [InlineData( double.NaN,               double.NaN,          0.0)]
1661         [InlineData( 0.0,                      0.0,                 0.0)]
1662         [InlineData( 0.31830988618379067,      0.30797791269089433, CrossPlatformMachineEpsilon)]       // value:  (1 / pi)
1663         [InlineData( 0.43429448190325183,      0.40890401183401433, CrossPlatformMachineEpsilon)]       // value:  (log10(e))
1664         [InlineData( 0.63661977236758134,      0.56259360033158334, CrossPlatformMachineEpsilon)]       // value:  (2 / pi)
1665         [InlineData( 0.69314718055994531,      0.6,                 CrossPlatformMachineEpsilon)]       // value:  (ln(2))
1666         [InlineData( 0.70710678118654752,      0.60885936501391381, CrossPlatformMachineEpsilon)]       // value:  (1 / sqrt(2))
1667         [InlineData( 0.78539816339744831,      0.65579420263267244, CrossPlatformMachineEpsilon)]       // value:  (pi / 4)
1668         [InlineData( 1.0,                      0.76159415595576489, CrossPlatformMachineEpsilon)]
1669         [InlineData( 1.1283791670955126,       0.81046380599898809, CrossPlatformMachineEpsilon)]       // value:  (2 / sqrt(pi))
1670         [InlineData( 1.4142135623730950,       0.88838556158566054, CrossPlatformMachineEpsilon)]       // value:  (sqrt(2))
1671         [InlineData( 1.4426950408889634,       0.89423894585503855, CrossPlatformMachineEpsilon)]       // value:  (log2(e))
1672         [InlineData( 1.5707963267948966,       0.91715233566727435, CrossPlatformMachineEpsilon)]       // value:  (pi / 2)
1673         [InlineData( 2.3025850929940457,       0.98019801980198020, CrossPlatformMachineEpsilon)]       // value:  (ln(10))
1674         [InlineData( 2.7182818284590452,       0.99132891580059984, CrossPlatformMachineEpsilon)]       // value:  (e)
1675         [InlineData( 3.1415926535897932,       0.99627207622074994, CrossPlatformMachineEpsilon)]       // value:  (pi)
1676         [InlineData( double.PositiveInfinity,  1.0,                 CrossPlatformMachineEpsilon * 10)]
Tanh(double value, double expectedResult, double allowedVariance)1677         public static void Tanh(double value, double expectedResult, double allowedVariance)
1678         {
1679             AssertEqual(expectedResult, Math.Tanh(value), allowedVariance);
1680         }
1681 
1682         [Fact]
Truncate_Decimal()1683         public static void Truncate_Decimal()
1684         {
1685             Assert.Equal(0.0m, Math.Truncate(0.12345m));
1686             Assert.Equal(3.0m, Math.Truncate(3.14159m));
1687             Assert.Equal(-3.0m, Math.Truncate(-3.14159m));
1688         }
1689 
1690         [Fact]
Truncate_Double()1691         public static void Truncate_Double()
1692         {
1693             Assert.Equal(0.0, Math.Truncate(0.12345));
1694             Assert.Equal(3.0, Math.Truncate(3.14159));
1695             Assert.Equal(-3.0, Math.Truncate(-3.14159));
1696         }
1697 
1698         [Fact]
BigMul()1699         public static void BigMul()
1700         {
1701             Assert.Equal(4611686014132420609L, Math.BigMul(2147483647, 2147483647));
1702             Assert.Equal(0L, Math.BigMul(0, 0));
1703         }
1704 
1705         [Theory]
1706         [InlineData(1073741, 2147483647, 2000, 1647)]
1707         [InlineData(6, 13952, 2000, 1952)]
1708         [InlineData(0, 0, 2000, 0)]
1709         [InlineData(-7, -14032, 2000, -32)]
1710         [InlineData(-1073741, -2147483648, 2000, -1648)]
1711         [InlineData(-1073741, 2147483647, -2000, 1647)]
1712         [InlineData(-6, 13952, -2000, 1952)]
DivRem(int quotient, int dividend, int divisor, int expectedRemainder)1713         public static void DivRem(int quotient, int dividend, int divisor, int expectedRemainder)
1714         {
1715             int remainder;
1716             Assert.Equal(quotient, Math.DivRem(dividend, divisor, out remainder));
1717             Assert.Equal(expectedRemainder, remainder);
1718         }
1719 
1720         [Theory]
1721         [InlineData(4611686018427387L, 9223372036854775807L, 2000L, 1807L)]
1722         [InlineData(4611686018427387L, -9223372036854775808L, -2000L, -1808L)]
1723         [InlineData(-4611686018427387L, 9223372036854775807L, -2000L, 1807L)]
1724         [InlineData(-4611686018427387L, -9223372036854775808L, 2000L, -1808L)]
1725         [InlineData(6L, 13952L, 2000L, 1952L)]
1726         [InlineData(0L, 0L, 2000L, 0L)]
1727         [InlineData(-7L, -14032L, 2000L, -32L)]
1728         [InlineData(-6L, 13952L, -2000L, 1952L)]
DivRemLong(long quotient, long dividend, long divisor, long expectedRemainder)1729         public static void DivRemLong(long quotient, long dividend, long divisor, long expectedRemainder)
1730         {
1731             long remainder;
1732             Assert.Equal(quotient, Math.DivRem(dividend, divisor, out remainder));
1733             Assert.Equal(expectedRemainder, remainder);
1734         }
1735     }
1736 }
1737