我已经使用C#三年制作游戏了,我玩各种模拟,数字有时变大,Int32
不足以存储价值。最终,即使Int64
对我的实验来说也不够,它需要几个这样的字段(实际上是一个可变长度的数组)和一个特殊属性来正确处理这些大数字。所以我想知道:有没有办法声明一个具有无限(事先未知)长度的数字变量,所以我可以放松一下,让计算机做数学计算?
我们可以在纸上写下我们喜欢的任何类型的数字而无需任何特殊的纸张。我们还可以在文本文件中键入大量单词,而无需进行特殊的文件系统更改,以使其正确保存和加载。是不是有一个变量来声明任何编程语言中谁知道多长的数字呢?
答案 0 :(得分:3)
从.NET 4开始,.NET框架包含BigInteger structure,它可以处理任意大小的整数。
由于您的问题与语言无关,因此值得一提的是内部 BigInteger将值存储在无符号整数数组中,有关详细信息,请参阅以下SO问题:
BigInteger是不可变的,因此不需要“调整”数组的大小。算术运算使用适当大小的数组创建BigInteger的 new 实例。
答案 1 :(得分:1)
是否有可能代表无限长度的数字[...]?
没有
在现有计算机上,由于计算机是有限的,因此无法表示无限数量。即使使用所有现有存储,也无法存储无限数字。
但是,存储非常大的数字是可能的。 Wikipedia has information关于任意精度整数的概念。
答案 2 :(得分:1)
“无限制” - 不,正如尼古拉·鲁赫悄悄地指出的那样。 “未知” - 是的,由第一点限定。 :}
其他人指出,.NET 4.0和Java中提供了BigInteger
类型。
对于.NET 2.0+,请查看IntX。
更一般地说,语言(或至少与它们一起使用的事实库)通常对任意长整数有一些支持,这提供了一种处理你描述的“未知”的方法。
discussion on the Ubuntu forums在某种程度上更普遍地解决了这个问题,并涉及更多语言的细节 - 其中一些提供了利用任意大整数的简单方法(例如Python和Common Lisp)。就个人而言,几年前Common Lisp中的“放松,让计算机做数学”因素对我来说是最高的:因此,你可能需要花费大量的时间来看待你的观点。
答案 3 :(得分:1)
大多数现代动态语言,如Perl6,Tcl8和Ruby更进一步,允许您在数字类型中存储无限(最多可用RAM)大小的数字。
这些语言中的大多数没有单独的整数和浮点类型,而是单个“数字”类型,它会自动转换为存储在RAM中的任何内容。有些像Perl6,甚至包括“数字”类型的复数。
如何在机器级别实现,默认情况下,数字假定为整数 - 所以int32或int64。如果需要,如果计算或赋值的结果不是整数,则将数字转换为浮点数或双精度数。如果整数增长得太大,那么解释器/运行时环境会以静默方式将其转换为bigInt对象/结构(这只是一个庞大的,可扩展的数组或整数的链接列表)。
程序员看起来数字的大小是无限的(再次,可达RAM)。
尽管如此,这个系统仍然存在问题(类似于0.1 + 0.2!= 0.3浮点数问题)所以你仍然需要了解底层实现,即使你可以忽略99.99%的时间
例如,如果在任何时候您将超大数字转换为浮点数(很可能是硬件中的两倍),您将失去精度。因为这就是浮点数的工作原理。有时你可以意外地做到这一点。例如,在某些语言中,幂函数(如C中的pow()
)返回浮点结果。因此,如果结果太大,则将整数提升到另一个整数的幂可能会截断结果。
在大多数情况下,它有效。我个人认为这是处理数字的理智方式。许多语言设计者显然已经独立地提出了这个解决方案。