basically no rules were defined for generic maths when Silk.NET.Maths when it was created, and we made no attempt to define them, instead allowing everything in the absence of rules set by an ecosystem authority (a la .NET API Review). this led to us defining our own Add, Subtract, etc in Scalar.BaseOps, and implementing every algorithm under the sun in terms of those fully generalised BaseOps regardless of whether its correct, makes sense, or would yield the correct results for a given type.
dot product can be implemented for int, so LengthSquared can be implemented for int, but the BCL has decided we should not be able to square root an int, so we should not implement length
now, i'm not against figuring out an API that allows the user to specify that they want an implicit upcast/downcast for a given operation, as this is what we did for some ops in some cases without the user knowing, but this way it codifies intent.
requiring IRootFunctions for Length makes sense instead of specifically requiring IFloatingPoint because it lets other non-float types that have sqrt well defined can use it
but still while respecting what the BCL have decided (i.e. "oh well i'm just going to require INumber for everything and reimplement everything that's not allowed myself because we want it to be as loose as possible" is not a valid take)
if the natural implementation of a (probably extension) function requires an operation imo we should have the generic constraint be the loosest interface for that, so just INumber and IRootFunctions for length for example