转自 http://aikilis.tk/

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。

  1. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:
    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不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。
  2. 除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。

所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确是从一位不认识的ACMer(ID:Staginner)的博客上学到的,他/她的很多代码中都使用了这个常量,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。

  1. 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
  2. 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
  3. 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。

转载于:https://www.cnblogs.com/wmxl/p/4662719.html

编程中无穷大常量的设定技巧 2014-08-19 09:22 35人阅读 评论(0) 收藏...相关推荐

  1. 编程中无穷大常量的设定技巧(ox3f3f3f3f)

    通过计算你会发现 0x3f3f3f3f 大约等于 109 而我们平时做题的数一般都会小于109所以会认会这个数是一个无穷大的数 原文: https://blog.csdn.net/qq_3126776 ...

  2. mysql中无穷大如何表示_编程中无穷大常量的设置技巧

    如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值 ...

  3. ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏...

    ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...

  4. linux分析字节序的分类及特点,计算机中的字节序详解 分类: 【Linux/Windows操作系统】 2015-01-07 21:54 97人阅读 评论(0) 收藏...

    我们都知道,内存中存储的是各种变量,各种奇葩东西,不用的变量占用不用的字长,例如在intel X86环境下,一个int占用两个字 0 1 2 3 4 5 6 7 8 9 0x30 0x31 0x32 ...

  5. 2014/12/05 随笔 2014-12-05 12:50 26人阅读 评论(0) 收藏...

    有一段时间没写博客了..发现博客出现了两篇空的博文..不知道是怎么回事..估计是CSDN眼子了 - -, 最近因为忙于辞职的事情,还是比较纠结的... 嗯 这篇文章就分享一下在写代码的时候EF闹眼子的 ...

  6. YUM更换源(1)--yum找不到安装包 2013-01-18 20:08 8687人阅读 评论(1) 收藏 举报 分类: linux(70) 公司提供的CentOS VM中,/etc/yum.r

    YUM更换源(1)--yum找不到安装包 2013-01-18 20:08 8687人阅读 评论(1) 收藏 举报 分类: linux(70) 公司提供的CentOS VM中,/etc/yum.rep ...

  7. mysql每一行数据类型_MySQL_MySQL编程中的6个实用技巧,每一行命令都是用分号(;)作为 - phpStudy...

    MySQL编程中的6个实用技巧 每一行命令都是用分号(;)作为结束 对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的 ...

  8. Python编程中一些异常处理的小技巧

    编程中经常会需要使用到异常处理的情况,在阅读了一些资料后,整理了关于异常处理的一些小技巧记录如下. 1 如何自定义异常 1.1 定义异常类 在实际编程中,有时会发现Python提供的内建异常的不够用, ...

  9. 凯立德2014秋季机车版C1204-C7K05-3323J0L懒人包 (5.0版)

    轉自:http://www.chenmoguoke.com/rjjp/gps/632.html#respond 凯立德2014秋季机车版C1204-C7K05-3323J0L懒人包 2014年11月0 ...

  10. 编程中无穷大的设定 很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相

    很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相加会变成负数,还有如 ...

最新文章

  1. SCOM2012部署系列之九:部署审核收集报告(ACSReporting)
  2. Windows Shell 学习 3
  3. C# Task的使用
  4. VC6.0下MFC按钮点击函数手动添加
  5. pemicro识别不了驱动_usb驱动无法识别怎么办-usb驱动无法识别通常解决办法 - 河东软件园...
  6. java网络编程udp_java网络编程(UDP详解)
  7. Flutter 中的Error的捕获及处理
  8. Leet Code OJ 219. Contains Duplicate II [Difficulty: Easy]
  9. Centos 下面升级系统内核(转)
  10. python制作加密工具_Python制作钉钉加密/解密工具
  11. leetcode mysql 排名_GitHub - nimphy/leetcode-Mysql
  12. 时间序列分析(6)| DF检验
  13. 计算机系统的组成doc,简述计算机系统的组成.doc
  14. python中global_Python中的global variables和local variables
  15. svn 合并分支 (svn操作手册)
  16. SEO必备工具之Xenu(绿蜗牛)网站死链接检测
  17. html svg 线条动画,SVG 线条动画入门
  18. 【我们一起写框架】MVVM的WPF框架(一)—序篇
  19. 010editor pyc template
  20. 大华股份发布Dahua Think #战略;国微思尔芯发布芯神瞳逻辑矩阵LX2;爱设计获数千万元融资 | 全球TMT...

热门文章

  1. git branch是什么意思
  2. kubernetes视频教程笔记 (24)-存储-PV和PVC
  3. java 弹框_java弹框
  4. jquery ajax修改密码,提交form表单---修改密码 ajax、jQuery
  5. html5 xml的区别,xhtml和html5区别 html与xhtml和xml有什么区别
  6. 云计算机室怎么样映射d 盘,云服务器磁盘如何映射到本地磁盘
  7. python解析多层json数据_python解析多层json操作示例
  8. h3c服务器设置u盘引导,H3C FlexServer R390服务器装系统前的准备工作
  9. LayaAir cacheAs 缓存与 visible 隐藏
  10. 阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类