如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:

if (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真的是一个非常棒的选择。

mysql中无穷大如何表示_编程中无穷大常量的设置技巧相关推荐

  1. java中封装的好处_编程中封装的作用/优点

    最近学习了Java三大特性中的封装,所以在这里总结一下自己堆封装的理解和简介,给大家做出参考. 什么是封装(Encapsulation): 封装(Encapsulation)是面向对象方法的重要原则, ...

  2. spring定时器突然不执行了_编程中常常遇到了定时器不工作的问题分析

    我们日常编程中在使用定时器后,发现定时器并没有按照自己的意图去计时,出现了不计时的错误,进而怀疑是否是硬件故障,CPU是否正常等等,浪费了很多的时间去排查,实际上就是由于我们对定时器的特性不了解所造成 ...

  3. 编程基础 垃圾回收_编程中的垃圾回收指南

    编程基础 垃圾回收 什么是垃圾回收? (What is Garbage Collection?) In general layman's terms, Garbage collection (GC) ...

  4. 最简单的python语言程序设计_编程中最简单的语言Python,这样学或许更容易

    最近微信小程序上面出了一个跳一跳的小游戏 大家有没有玩呀? 编程中最简单的语言Python,这样学或许更容易 分享之前我还是要推荐下我自己建的Python开发学习群:628979297,群里都是学Py ...

  5. mysql 表组是什么_数据库中属性组究竟是什么含义?

    展开全部 属性组的含义就是一组具有相互联系的属性组合而62616964757a686964616fe58685e5aeb931333433626564成的. 属性是比如一张表格中的学号和姓名等.一个事 ...

  6. 吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

    电影<喜剧之王>里,周星驰饰演的尹天仇,是一个渴望成为真正的演员,却不断沦为落魄跑龙套的小人物. 即便如此,他对演戏的态度始终认真而可敬.他每天不但锲而不舍寻找演戏机会,还在街坊福利社开了 ...

  7. MySQL中什么是码_数据库中的码是什么含义?

    展开全部 1.超码e68a843231313335323631343130323136353331333365656662: 超码是一个或多个属性的集合,这些属性可以让我们在一个实体集(所谓的实体集就 ...

  8. vs 服务容器中已存在服务_容器中某Go服务GC停顿经常超过100ms排查

    GC停顿经常超过100ms 现象有同事反馈说,最近开始试用公司的Kubernetes,部署在Docker里的Go进程有问题,接口耗时很长,而且还有超时.逻辑很简单,只是调用了KV存储,KV存储一般响应 ...

  9. c语言中错误executing,C语言编程中常见问题解读.doc

    C语言编程中常见问题解读 为什么vc6打开的文件却不能编译1 为什么一个vc6工程中有两个main函数不能编译成功?我想写两个程序怎么办?2 为什么v6不能编译程序,生成信息说compile和link ...

最新文章

  1. 高并发系统三大利器之限流
  2. 奔跑吧Linux内核 入门篇(第二版)遇到问题发
  3. Opendaylight将自己写的feature添加到控制器当中
  4. Python类属性和实例属性分别是什么?
  5. SQLServer之创建显式事务
  6. PowerShell批量检查域密码弱口令
  7. 如何启用SAP Business by design里的Correction Invoice功能
  8. 整流桥-桥式整流工作原理
  9. 别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文
  10. java源代码加密+使用proguard混淆java web项目代码+自定义Classloader
  11. java excel 晒新年操作_JAVA使用POI操作excel
  12. 12v服务器电源改可调_赫尔槽试验电源的选择(修订版)
  13. vector使用中可能出现的一个陷阱
  14. 汇编指令入门级整理 | 原力计划
  15. Fefora17联想笔记本安装无线网卡
  16. utilities(matlab)—— 图像分块(image2cols、cols2image)
  17. oracle 游标详解
  18. python-多态_new魔法方法_单态模式_连贯操作
  19. 理解File's ower 和first respond
  20. mmdetection3d S3DIS (持续更新)

热门文章

  1. 【MATLAB】高塔观测数据通量梯度法计算感热及潜热通量
  2. 嵌入式文件系统基础知识
  3. 如何获得ADI公司的技术支持服务
  4. 午夜00:37分,与蚊子相伴无眠之夜
  5. 基于AdaBoost的人脸检测
  6. [计算机图形学入门]9.几何
  7. 第八章 DataStream API
  8. 怎样做个微信图文链接广告宣传活动?
  9. 【JS 逆向百例】医保局 SM2+SM4 国产加密算法实战
  10. ROS开发之如何使用RPLidar A1二维激光雷达?