在.NET中,128位数字应该使用什么类型

本文关键字:什么 类型 数字 NET 128位 | 更新日期: 2023-09-27 17:48:51

我需要做一些大整数运算。有没有表示128位整数并实现所有常用运算符的类或结构?

顺便说一句,我意识到decimal可以用来表示96位整数。

在.NET中,128位数字应该使用什么类型

虽然BigInteger是大多数应用程序的最佳解决方案,但如果您有性能关键的数值计算,则可以在我的Dirichlet.Numberics库中使用完整的Int128UInt128实现。如果Int64UInt64太小,但BigInteger太慢,则这些类型很有用。

它在System.Numerics中。"BigInteger类型是一个不可变的类型,它表示一个任意大的整数,其值在理论上没有上限或下限"

var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");

System.Int128System.UInt128自.NET Core 7.0 Preview 5 以来一直可用

它们是在添加对Int128和UInt128数据类型的支持中实现的

我不知道为什么它们没有出现在.NET 7 Preview 5公告中,但在即将发布的.NET 7 Preview6公告中,Preview 5 中的新类型也将出现Int128ConverterUInt128Converter

不过,它们还没有C#支持,就像System.Half一样,所以您必须显式使用Int128,而不是使用本机C#关键字

不,.NET中没有任何东西<=3.5.我希望/期待BigInteger能在.NET 4.0中回归。(它是从.NET 3.5中截取的。)

BigInteger现在是C#和.NET 4.0中的朋友的标准部分。参见:Gunnar Peipman的ASP.NET博客。

请注意,CPU通常可以更快地在恒定时间内处理普通整数,尤其是在使用常用数学运算符(+、-、/、…)时,因为这些运算符通常直接映射到单个CPU指令。

对于BigInteger,即使是最基本的数学运算,对运行时随数字大小而变化的方法的函数调用也要慢得多。这是因为BigInteger实现了任意精度的算术,这增加了相当大但必要的开销。其好处是BigIntegers不限于64位甚至128位,而是受可用系统内存的限制(或精度约为264位,以先到者为准)
请阅读此处。

GUID在.NET框架中由128位整数支持;尽管它没有附带任何典型的整数类型方法。

我以前为GUID编写过一个处理程序,将其视为128位整数,但这是为我工作了大约8年的一家公司编写的。我不再可以访问源代码。

因此,如果您需要128位整数的本机支持,并且出于任何原因不想依赖BigInteger,您可能会破解GUID来满足您的目的。

如果你不介意引用J#库(默认情况下VS中包含vjslib.dll),那么.NET 中已经有BigInteger并实现了它

using java.math;
public static void Main(){
    BigInteger biggy = new BigInteger(....)
}

C#PCL库,用于Int128和Int256等大数字的计算。https://github.com/lessneek/BigMath

我相信Mono有一个BigInteger实现,您应该能够跟踪其源代码。