在.NET中,128位数字应该使用什么类型
本文关键字:什么 类型 数字 NET 128位 | 更新日期: 2023-09-27 17:48:51
我需要做一些大整数运算。有没有表示128位整数并实现所有常用运算符的类或结构?
顺便说一句,我意识到decimal
可以用来表示96位整数。
虽然BigInteger
是大多数应用程序的最佳解决方案,但如果您有性能关键的数值计算,则可以在我的Dirichlet.Numberics库中使用完整的Int128
和UInt128
实现。如果Int64
和UInt64
太小,但BigInteger
太慢,则这些类型很有用。
它在System.Numerics中。"BigInteger类型是一个不可变的类型,它表示一个任意大的整数,其值在理论上没有上限或下限"
var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");
System.Int128
和System.UInt128
自.NET Core 7.0 Preview 5 以来一直可用
它们是在添加对Int128和UInt128数据类型的支持中实现的
我不知道为什么它们没有出现在.NET 7 Preview 5公告中,但在即将发布的.NET 7 Preview6公告中,Preview 5 中的新类型也将出现Int128Converter
和UInt128Converter
不过,它们还没有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实现,您应该能够跟踪其源代码。