Int128 in .Net?
我需要做一些大整数数学。 是否存在表示128位整数并实现所有常用运算符的类或结构?
顺便说一句,我意识到十进制可以用来表示一个96位的整数。
-
出于好奇,为什么您需要处理这么大的数量?
-
请注意,本机无符号int128将自然表示IPv6地址,这增加了此问题的紧迫性和相关性
-
C ++中确实有一个问题会对此进行更详细的讨论,特别是如何模拟Int128加减法stackoverflow.com/a/741371/58961
在System.Numerics中。" BigInteger类型是不可变的类型,表示任意大的整数,其理论上的值没有上限或下限。"
1
| var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000"); |
-
好的,所以BigInteger满足了需求,但它不是Int128类型,它会进行堆分配(每个操作很多em),并且对32位字进行操作,这样会产生开销,并且它支持任意范围,如果我知道我确实需要Int128类型,就不会使用它。我认为人们一段时间以来一直在使用较小尺寸的整数来模拟较大尺寸的整数(由于各种硬件限制),因此不应该很难找到合适的C代码并加以改编。我的观点是,BigInteger是针对一般情况的解决方案,而不是专门针对Int128的解决方案。
-
仅供参考:BigInteger不适用于.NET 2
-
BigInteger≠Int128
-
如果您追求性能,请使用两个qword(long)代替biginteger。
虽然BigInteger是大多数应用程序的最佳解决方案,但是如果您具有对性能至关重要的数值计算,则可以在我的Dirichlet.Numerics库中使用完整的Int128和UInt128实现。如果Int64和UInt64太小而BigInteger太慢,则这些类型很有用。
-
这以一种非常有用的方式最准确地回答了问题。
-
您的uint128有四个ulong字段,导致它使用32个字节。为什么需要两个额外的乌龙呢?
-
不,它有两个乌龙场。某些运算(例如模数乘法)需要256位精度才能获得中间结果,因此还需要UInt256的表示形式。该私有类型确实(并且必须具有)具有四个ulong字段。
不,.NET <= 3.5中没有任何内容。我希望/期望BigInteger将在.NET 4.0中返回它。 (它是从.NET 3.5中删除的。)
-
希望他们能改写那个垃圾! :)
-
它实际上是在.NET 4.0中重新引入的,并且仍然存在。
-
@DrewNoakes:的确-可耻的BigDecimal仍然被削减了:(
-
@markshep:同意,尽管我认为在几乎所有答案中添加复制/粘贴评论实际上不是一个好主意。但是对于想使用大整数的人来说,BigInteger可能是最好的解决方案。当然,需要额外的工作才能使其溢出,就像Int128一样。
BigInteger现在是.NET 4.0中C#和朋友的标准部分。请参阅:Gunnar Peipman的ASP.NET博客。
请注意,CPU通常可以更快,更恒定的速度处理普通整数,尤其是在使用常规数学运算符(+,-,/,...)时,因为这些运算符通常直接映射到单个CPU指令。
使用BigInteger,即使是最基本的数学运算,对方法的运行速度也要慢得多,这些方法的运行时间随数字的大小而变化。这是因为BigInteger实现了任意精度算法,这增加了可观但必要的开销。
这样做的好处是BigIntegers不限于64位甚至128位,而是由可用的系统内存(或大约2 ^ 64位的精度,以先到者为准)。
在这里阅读。
-
@markshep:我意识到,但是BigInteger满足了I need to do some large integer math.的要求,我认为我的错误在于没有提及它满足了implement▼显示 all of the usual operators"的要求。我已经编辑了答案以反映这一点,并添加了关于任意精度算术的一些注释。
-
"注意BigInteger不支持通常的运算符"是什么意思?
-
@AluanHaddad:我的意思是BigInteger运算符被重载,不仅仅是带有CPU指令的简单1:1映射,而且很明显是泥泞的,所以我重写了那篇文章。
如果您不介意引用J#库(默认情况下VS包含vjslib.dll),则.NET中已经存在BigInteger并已实现
1 2 3 4 5 6
| using java.math;
public static void Main (){
BigInteger biggy = new BigInteger (....)
} |
C#PCL库用于大量计算,例如Int128和Int256。
https://github.com/everbytes/BigMath
GUID由.NET框架中的128位整数支持;尽管它没有任何典型的整数类型方法。
之前我已经为GUID编写了处理程序,将其视为128位整数,但这是给我工作大约8年的公司使用的。我不再可以访问源代码。
因此,如果您需要对128位整数的本机支持,并且由于某种原因不想依赖BigInteger,则可能会破解GUID来满足您的目的。
-
可以存储,但是如果我想加,减,乘等,那么使用其他方法可能会更好
-
正确。我们将其用作位掩码(数据库中的列从64位更新为guid),因此存储就足够了。功能改进的时间限制导致解决方案不可靠。
这是.NET中Int128的实现:
https://int128.codeplex.com/
-
之前已经回答了此问题,但效果不佳,评论中已经提到了这一事实。
这是来自.net的big integer的实现。
http://msdn.microsoft.com/en-us/magazine/cc163696.aspx
我相信Mono具有BigInteger实现,您应该能够跟踪其来源。