星期日, 四月 26, 2009

c语言中的数据溢出overflow解决

在日常生活中数字是没有大小限制的,但是计算机中的变量是有限制的,不能够完全表现现实世界中的数字,因而就产生了溢出问题。

用常见的Fibonacci数列来说,第一项是0,第二项是1,后面的每一项都是它前两项之和。
0, 1, 1, 2, 3, 5, 8, 13......
这个数列的增长实际上是很快的,当超出计算机变量所能表现的类型的上限后,结果就变为了负值,发生了溢出。

通过一段代码实验Fibonacci数列溢出


这已经使用了最大的数字的数据类型long long,如果还有更大的数字怎么办?我们满手油污的去操作内存分配?
幸好有GNU项目,里面的一个名为gmp(GNU Mutiple Precision Arithmeic Library)的库为我们解决了这一棘手的问题。这个库提供了很多基础的内存分配特性。

修改后的代码:

该库在数值和字符串中做了很好的处理,使你能获得一个真正没有溢出的数值,更符合客观世界的概念。

参考文献:
  1. Full Circle #24
  2. http://gmplib.org/manual/

没有评论: