.Net中的Int128?

Ada*_*gen 62 .net c# int128

我需要做一些大整数数学.是否有任何类或结构代表一个128位整数并实现所有常用的运算符?

顺便说一句,我意识到十进制可以用来表示一个96位的int.

Lar*_*nal 40

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

var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");
Run Code Online (Sandbox Code Playgroud)

  • 好吧,所以BigInteger满足了这个需求,但它不是Int128类型,它进行堆分配(很多'em,每个操作)并且操作32位字,这样的开销就有这样的开销,而它支持任意范围如果我知道我真的需要Int128类型,我不会用它.我认为人们已经使用较小的整数来模拟一个较大的整数一段时间(由于各种硬件限制),并且不应该很难找到合适的C代码并进行调整.我的观点是,BigInteger是一般案例的解决方案,而不是Int128. (43认同)
  • BigInteger≠Int128 (10认同)

phu*_*clv 30

System.Int128System.UInt128自 .NET Core 7.0 Preview 5 起可用

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

我不知道为什么它们没有出现在.NET 7 Preview 5 公告中,但在即将发布的 .NET 7 Preview 6 公告中也会出现Int128Converter,并且UInt128Converter对于 Preview 5 中的新类型

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


Ric*_*key 28

虽然BigInteger对于大多数应用程序来说是最佳解决方案,但如果您有性能关键的数值计算,则可以使用Dirichlet.Numerics库中的完整Int128UInt128实现.这些类型是如果有用的话和过小,但速度太慢.Int64UInt64BigInteger

  • 不,它有两个 ulong 字段。某些运算(例如模乘)需要 256 位精度的中间结果,因此 UInt256 的表示也是必要的。该私有类型确实(并且必须有)有四个 ulong 字段。 (3认同)
  • 这最准确地回答了这个问题,而且非常有帮助。 (2认同)

Jon*_*eet 12

不,.NET <= 3.5中没有任何内容.我希望/期望BigInteger能够在.NET 4.0中获得回报.(它是从.NET 3.5删除的.)

  • 它实际上是[在.NET 4.0中重新引入](http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v = vs.110).aspx)并且仍然存在. (3认同)
  • @markshep:同意,虽然我认为在几乎所有答案中添加复制/粘贴评论实际上并不是一个好主意.但对于想要使用大整数的人来说,"BigInteger"可能是最好的解决方案.当然,需要额外的工作来使其以与Int128相同的方式溢出. (3认同)

Cha*_*rns 6

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

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

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

  • @markshep:我意识到,但 BigInteger 满足了要求,“我需要做一些大整数数学运算。”我认为我的错误是没有提到它满足要求,“实现所有常用运算符”。 .我编辑了答案以反映这一点,并添加了一些关于任意精度算术的注释。 (2认同)