2026-04-04 13:18:04 -04:00
|
|
|
using System.Numerics;
|
|
|
|
|
|
|
|
|
|
namespace SJK.Math;
|
|
|
|
|
|
|
|
|
|
public static class SJKMath
|
|
|
|
|
{
|
2026-04-13 23:22:55 -04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the max number in a array of values.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
|
|
/// <param name="values"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
/// <exception cref="ArgumentException"></exception>
|
2026-04-04 13:18:04 -04:00
|
|
|
public static T Max<T>(params T[] values) where T : INumber<T>
|
|
|
|
|
{
|
|
|
|
|
if (values.Length == 0)
|
|
|
|
|
throw new ArgumentException($"No values provided");
|
|
|
|
|
T max = values[0];
|
|
|
|
|
foreach (var item in values.Skip(1))
|
|
|
|
|
{
|
|
|
|
|
max = T.Max(item, max);
|
|
|
|
|
}
|
|
|
|
|
return max;
|
|
|
|
|
}
|
|
|
|
|
public static T Min<T>(params T[] values) where T : INumber<T>
|
|
|
|
|
{
|
|
|
|
|
if (values.Length == 0)
|
|
|
|
|
throw new ArgumentException($"No values provided");
|
|
|
|
|
T max = values[0];
|
|
|
|
|
foreach (var item in values.Skip(1))
|
|
|
|
|
{
|
|
|
|
|
max = T.Min(item, max);
|
|
|
|
|
}
|
|
|
|
|
return max;
|
|
|
|
|
}
|
|
|
|
|
public static long UpperPowerOfTwo(long v)
|
|
|
|
|
{
|
|
|
|
|
v--;
|
|
|
|
|
v |= v >> 1;
|
|
|
|
|
v |= v >> 2;
|
|
|
|
|
v |= v >> 4;
|
|
|
|
|
v |= v >> 8;
|
|
|
|
|
v |= v >> 16;
|
|
|
|
|
v++;
|
|
|
|
|
return v;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
public static int UpperPowerOfTwo(int v)
|
|
|
|
|
{
|
|
|
|
|
v--;
|
|
|
|
|
v |= v >> 1;
|
|
|
|
|
v |= v >> 2;
|
|
|
|
|
v |= v >> 4;
|
|
|
|
|
v |= v >> 8;
|
|
|
|
|
v |= v >> 16;
|
|
|
|
|
v++;
|
|
|
|
|
return v;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|