无穷大无穷小
来源:互联网 发布:淘宝店怎么做链接地址 编辑:程序博客网 时间:2024/04/29 11:21
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。
- 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:
if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。 - 除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。
所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确是从一位不认识的ACMer(ID:Staginner)的博客上学到的,他/她的很多代码中都使用了这个常量,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。
- 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
- 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
- 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。
所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。
无穷大的另一种写法 memset(a,127,sizeof(a));
无穷小的写法 memset(a,128,sizeof(b));
阅读全文
0 0
- 无穷大无穷小
- 无穷小与无穷大
- 无穷小与无穷大
- 被无穷大和无穷小难道
- 关于memset赋值无穷大无穷小
- Double的无穷大和无穷小
- 【高数】无穷小与无穷大
- 无穷小和无穷大·漫画
- 32位整型“无穷大”“无穷小”的理解
- java中怎样表示一个无穷大? 无穷小?
- memset 赋初值为无穷大和无穷小
- 高等数学-对无穷小无穷大的理解
- ACM中无穷大,无穷小的设定
- 高数 01.04无穷小与无穷大
- python中无穷大与无穷小表示
- 理想运放输入阻抗无穷大,输出阻抗无穷小
- java的浮点的精度、无穷大、无穷小、和非数
- 高等数学:第一章 函数与极限(2)无穷大 无穷小 极限准则
- RTSP 协议
- 事件循环和任务队列
- Null or zero primary key encountered in unit of work clone exception not working 解决方法
- gpuArray
- 补充篇 基于linux centos 7安装elasticsearch5.6.3(最新版)教程
- 无穷大无穷小
- 广义表的非递归深度优先遍历及相关运算的c++实现
- 10.31
- 速卖通开放平台调用菜鸟组件实现云打印
- Unity性能优化总结
- 报错: java.lang.IllegalStateException: Failed to load ApplicationContext
- 将数组保存到文件系统中(Objective-C 开发范例)
- 【Angular4】No value accessor for form control with name: '***'
- Java —— RMI + Element 老是出现java.io.EofException 或java.rmi.UnmarshalException: Error unmarshaling retu