关于0x3f3f3f3f(0x四个3f)
来源:互联网 发布:淘宝购买伟哥 编辑:程序博客网 时间:2024/05/20 10:11
在之前一道最小生成树问题中遇到过,我按照以前的习惯把INF定义为10亿,然后初始化数组为最大值,然后输入连通的路+value,最后值仍然为INF的即为不通的。但是这里出问题了,INF定义为10亿的话,最后显示的数组的值是负的,最后改成0x3f3f3f3f终于解决了。
今天正好看到一篇相关的博客,故细细分析一下。
引用自:http://blog.csdn.net/bossup/article/details/9090277
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取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真的是一个非常棒的选择。
负无穷大用0xcfcfcfcf比较好。
- 关于0x3f3f3f3f(0x四个3f)
- 【0x7FFFFFFF】【0x3f3f3f3f】
- 0x3f3f3f3f--无穷大
- 0x3f3f3f3f的奇妙
- 0x3f3f3f3f知多少
- 为什么无穷大总是0x3f3f3f3f?
- 使用0x3f3f3f3f表示无穷大
- 使用0x3f3f3f3f表示无穷大
- 使用0x3f3f3f3f表示无穷大
- 为何将INF设置为0x3f3f3f3f
- 使用二分法求解f(x)=x^3-x-1=0在区…
- 第17周 oj 求和 f(x)=x^2+1;求 f(0)+f(1)+...........+f(n)
- 用弦截法求方程 f(x)=x^3-5x^2+16x-80=0 的根
- 【hdu 2112】 HDU Today ( 最短路 Dijkstra)0x3f3f3f3f
- 0x3f3f3f3f...编程中无穷大常量的设置技巧
- 0x3f3f3f3f...编程中无穷大常量的设置技巧
- 0x3f3f3f3f…编程中无穷大常量的设置技巧
- 0x3f3f3f3f...编程中无穷大常量的设置技巧
- 【The first day】SSD+4G+win8 pro+ubuntu 14.04
- Scala的单例对象
- ANDROID窗口管理服务实现机制和架构分析
- STL系列之二 stack栈
- c语言思想4
- 关于0x3f3f3f3f(0x四个3f)
- HDUJ 2553 N皇后问题 回溯法
- 线程同步
- spring 注解用法收集
- VS2010 添加OnInitDialog的方法
- POJ 2886 Who Gets the Most Candies? (线段树,单点更新)
- shell 匹配字符串 (eg.获得配置文件的值 )
- [iOS]UITableView实现简单瀑布流
- 转:typedef的用法