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