{"id":17315787,"url":"https://github.com/tylerbrinkley/genumerics","last_synced_at":"2025-07-08T23:02:02.377Z","repository":{"id":53592617,"uuid":"196065685","full_name":"TylerBrinkley/Genumerics","owner":"TylerBrinkley","description":"Genumerics is a high-performance .NET library for generic numeric operations","archived":false,"fork":false,"pushed_at":"2021-03-26T14:00:17.000Z","size":204,"stargazers_count":19,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-06-16T02:02:54.148Z","etag":null,"topics":["csharp","dotnet","dotnet-core","generic","numeric"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TylerBrinkley.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-09T18:54:55.000Z","updated_at":"2023-06-06T09:53:46.000Z","dependencies_parsed_at":"2022-09-09T11:21:52.316Z","dependency_job_id":null,"html_url":"https://github.com/TylerBrinkley/Genumerics","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/TylerBrinkley/Genumerics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerBrinkley%2FGenumerics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerBrinkley%2FGenumerics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerBrinkley%2FGenumerics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerBrinkley%2FGenumerics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TylerBrinkley","download_url":"https://codeload.github.com/TylerBrinkley/Genumerics/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerBrinkley%2FGenumerics/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264363731,"owners_count":23596499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","dotnet","dotnet-core","generic","numeric"],"created_at":"2024-10-15T13:10:25.032Z","updated_at":"2025-07-08T23:02:02.331Z","avatar_url":"https://github.com/TylerBrinkley.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"![GitHub last commit (master)](https://img.shields.io/github/last-commit/TylerBrinkley/Genumerics/master.svg?logo=github)\n[![NuGet Version](https://img.shields.io/nuget/v/Genumerics.svg?logo=nuget)](https://www.nuget.org/packages/Genumerics/)\n[![NuGet Downloads](https://img.shields.io/nuget/dt/Genumerics.svg?logo=nuget)](https://www.nuget.org/packages/Genumerics/)\n\n# Genumerics\nGenumerics is a high-performance .NET library for generic numeric operations. It is compatible with .NET Framework 4.5+ and .NET Standard 2.0+.\n\n## The Problem\nYou may have come across while working in .NET where you would like to perform numeric operations over a generic numeric type. Unfortunately .NET doesn't provide a way to do that natively.\n\nThis library fills that gap by providing most standard numeric operations for the following built-in numeric types and their nullable equivalents with the ability to add support for other numeric types.\n\n`sbyte`, `byte`, `short`, `ushort`, `int`, `uint`, `long`, `ulong`, `float`, `double`, `decimal`, `nint`, `nuint`, and `BigInteger`\n\n## Genumerics Demo\nBelow is a demo of some basic uses of Genumerics in the form of unit tests.\n```c#\nusing Genumerics;\nusing NUnit.Framework;\n\npublic class GenumericsDemo\n{\n    [TestCase(4, 5, 9)]\n    [TestCase(2.25, 6.75, 9.0)]\n    public void Add\u003cT\u003e(T left, T right, T expected)\n    {\n        Assert.AreEqual(expected, Number.Add(left, right));\n        Assert.AreEqual(expected, AddWithOperator\u003cT\u003e(left, right));\n    }\n\n    private T AddWithOperator\u003cT\u003e(Number\u003cT\u003e left, Number\u003cT\u003e right) =\u003e left + right;\n\n    [TestCase(9, 6, true)]\n    [TestCase(3.56, 4.07, false)]\n    public void GreaterThan\u003cT\u003e(T left, T right, bool expected)\n    {\n        Assert.AreEqual(expected, Number.GreaterThan(left, right));\n        Assert.AreEqual(expected, GreaterThanWithOperator\u003cT\u003e(left, right));\n    }\n\n    private bool GreaterThanWithOperator\u003cT\u003e(Number\u003cT\u003e left, Number\u003cT\u003e right) =\u003e left \u003e right;\n\n    [TestCase(4, 4.0)]\n    [TestCase(27.0, 27)]\n    public void Convert\u003cTFrom, TTo\u003e(TFrom value, TTo expected)\n    {\n        Assert.AreEqual(expected, Number.Convert\u003cTFrom, TTo\u003e(value));\n        Assert.AreEqual(expected, Number.Create(value).To\u003cTTo\u003e());\n    }\n\n    [TestCase(\"98765\", 98765)]\n    [TestCase(\"12.3456789\", 12.3456789)]\n    public void Parse\u003cT\u003e(string value, T expected)\n    {\n        Assert.AreEqual(expected, Number.Parse\u003cT\u003e(value));\n    }\n\n    [TestCase(123, null, \"123\")]\n    [TestCase(255, \"X\", \"FF\")]\n    public void ToString\u003cT\u003e(T value, string? format, string expected)\n    {\n        Assert.AreEqual(expected, Number.ToString(value, format));\n    }\n\n    [TestCase(sbyte.MaxValue)]\n    [TestCase(float.MaxValue)]\n    public void MaxValue\u003cT\u003e(T expected)\n    {\n        Assert.AreEqual(expected, Number.MaxValue\u003cT\u003e());\n    }\n}\n```\n\n## Performance Comparison\nThe summation algorithms below were benchmarked in .NET Core 3.0 and .NET 4.8 to determine the relative performance of the library compared with an `int` specific algorithm. As can be seen in the results, the performance is equivalent.\n\n### Results\n|     Method |       Mean |   Error |  StdDev | Ratio |\n|----------- |-----------:|--------:|--------:|------:|\n|        Sum |   531.0 ns | 1.40 ns | 1.31 ns |  1.00 |\n|  SumNumber |   521.2 ns | 1.41 ns | 1.32 ns |  0.98 |\n| SumNumber2 |   531.7 ns | 0.81 ns | 0.76 ns |  1.00 |\n|     SumAdd |   530.1 ns | 1.04 ns | 0.97 ns |  1.00 |\n|    SumAdd2 |   532.2 ns | 1.60 ns | 1.33 ns |  1.00 |\n\n### Code\n```c#\nusing System;\nusing BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Jobs;\nusing BenchmarkDotNet.Running;\nusing Genumerics;\n\npublic class Program\n{\n    static void Main() =\u003e BenchmarkRunner.Run\u003cSumBenchmarks\u003cint, DefaultNumericOperations\u003e\u003e();\n}\n\n[SimpleJob(RuntimeMoniker.Net461), SimpleJob(RuntimeMoniker.NetCoreApp30), LegacyJitX86Job]\npublic class SumBenchmarks\u003cT, TNumericOperations\u003e\n    where TNumericOperations : struct, INumericOperations\u003cT\u003e\n{\n    private int[] _intItems;\n    private T[] _items;\n\n    [Benchmark(Baseline = true)]\n    public int Sum()\n    {\n        int sum = 0;\n        foreach (int item in _intItems)\n        {\n            sum += item;\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public T SumNumber()\n    {\n        Number\u003cT\u003e sum = default;\n        foreach (T item in _items)\n        {\n            sum += item;\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public T SumNumber2()\n    {\n        Number\u003cT, TNumericOperations\u003e sum = default;\n        foreach (T item in _items)\n        {\n            sum += item;\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public T SumAdd()\n    {\n        T sum = default;\n        foreach (T item in _items)\n        {\n            sum = Number.Add(sum, item);\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public T SumAdd2()\n    {\n        T sum = default;\n        TNumericOperations operations = default;\n        foreach (T item in _items)\n        {\n            sum = operations.Add(sum, item);\n        }\n        return sum;\n    }\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        _intItems = new int[1000];\n        _items = new T[1000];\n        Random rand = new Random();\n        for (int i = 0; i \u003c 1000; ++i)\n        {\n            int value = rand.Next(10);\n            _intItems[i] = value;\n            _items[i] = Number.Create(value).To\u003cT\u003e();\n        }\n    }\n}\n```\n\n## Interface\n\nSee [fuget](https://www.fuget.org/packages/Genumerics/1.0.2/lib/netcoreapp3.0/Genumerics.dll/Genumerics/Number) for exploring the interface.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylerbrinkley%2Fgenumerics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftylerbrinkley%2Fgenumerics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylerbrinkley%2Fgenumerics/lists"}