Open
Description
Background and motivation
.NET 9 lacks BigMul
API for nuint
for some reason.
BigMul
is useful for implementing something like multiplicative hashing, decoding factoradic with fixed max input value, Lemire's algorithm
for generating bounded random integers efficiently, and fast fraction multiplications (necessary for something like MemoryMarshal.Cast<Vector4, Vector3>()
).
API Proposal
namespace System
{
public readonly struct UIntPtr
{
public static nuint BigMul(nuint a, nuint b, out nuint low);
}
public readonly struct IntPtr
{
public static nint BigMul(nint a, nint b, out nint low);
}
}
API Usage
var sb = new StringBuilder("0.");
var low = ~(nuint)0;
while (low > 0)
{
sb.Append($"{nuint.BigMul(10, low, out low)}");
}
Console.Out.WriteLine(sb);
Alternative Designs
Risks
None