Why are INumber.CreateX(int n) so slow compared to implicit casting for floats and doubles?

I’m working on a Maths library, and I’d like to be able to convert it to use the new INumber<T> interfaces in System.Numerics. The methods in here are often on hot paths and so would be good if they can be as fast as possible, while also being pleasant to work with. I’ve been benchmarking them as I go, and noticed something that seems a little odd.

There’s a few cases where we divide an array value by its index, due to using System.Numerics, this cannot be done via an implicit conversion like you would when the type is defined, the recommended method seems to be to use INumber<T>.Create{Checked|Saturating|Truncating}(int n)

The benchmark methods I’m running are fairly simple, like so:

public static double[] DivideByImplicit(double[] values)
{
    double[] result = new double[values.Length];
    for (int i = 1; i < result.Length; i++)
    {
        result[i] = values[i] / i;
    }

    return result;
}

// Overloads for other types (int, long, float, decimal)
// ...


public static T[] DivideByChecked<T>(T[] values) where T : INumber<T>
{
    T[] result = new T[values.Length];
    for (int i = 1; i < values.Length; i++)
    {
        result[i] = values[i] / T.CreateChecked(i);
    }

    return result;
}

// Same again but for Saturating/Truncating
// ...

For int, long and decimal, the results are within a few percentage points at most, but when it comes to float and double there’s a much larger performance hit, ~25% for double but up to a full 100% increase in time for float:

Method Categories Count Mean Error StdDev Ratio RatioSD
ConcreteDecimal decimal 1000 29,292.733 ns 146.0540 ns 136.6190 ns 1.00 0.00
CheckedDecimal decimal 1000 28,884.550 ns 82.0562 ns 76.7554 ns 0.99 0.00
SaturatingDecimal decimal 1000 29,948.023 ns 61.6380 ns 54.6404 ns 1.02 0.01
TruncatingDecimal decimal 1000 30,367.067 ns 67.0287 ns 62.6987 ns 1.04 0.01
ConcreteDouble double 1000 1,067.421 ns 20.5178 ns 24.4250 ns 1.00 0.00
CheckedDouble double 1000 1,342.562 ns 17.7660 ns 14.8354 ns 1.25 0.03
SaturatingDouble double 1000 1,343.400 ns 16.4938 ns 13.7731 ns 1.25 0.04
TruncatingDouble double 1000 1,394.057 ns 27.2936 ns 44.0740 ns 1.31 0.04
ConcreteFloat float 1000 636.576 ns 4.9312 ns 4.6127 ns 1.00 0.00
CheckedFloat float 1000 1,282.109 ns 13.9466 ns 12.3633 ns 2.01 0.02
SaturatingFloat float 1000 1,288.927 ns 10.4365 ns 8.7149 ns 2.03 0.02
TruncatingFloat float 1000 1,291.335 ns 20.6446 ns 17.2392 ns 2.03 0.04
ConcreteInt int 1000 1,210.849 ns 13.0819 ns 12.2368 ns 1.00 0.00
CheckedInt int 1000 1,202.773 ns 7.3879 ns 6.5492 ns 0.99 0.01
SaturatingInt int 1000 1,201.430 ns 8.0413 ns 6.7149 ns 0.99 0.01
TruncatingInt int 1000 1,199.158 ns 9.0592 ns 7.0728 ns 0.99 0.01
ConcreteLong long 1000 1,712.002 ns 19.3905 ns 17.1891 ns 1.00 0.00
CheckedLong long 1000 1,716.886 ns 17.9844 ns 16.8226 ns 1.00 0.01
SaturatingLong long 1000 1,712.213 ns 31.2334 ns 29.2157 ns 1.00 0.02
TruncatingLong long 1000 1,771.120 ns 34.2546 ns 40.7777 ns 1.03 0.03

Why is the impact so much higher when converting to a float/double than it is to any other numeric type? Not shown for brevity, but I also ran benchmarks for arrays of size 1, 100 and 1_000_000, and the slowdown wasn’t visible on 1 or 100, but was similar on 1_000_000.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật