编程中关于无穷大的设定技巧

在很多情况下,都是用0x7FFFFFFF作为无穷大,因为这是32-bit int的最大值。
如果使用无穷大做一般的比较(比如求最小值min变量的初始值)0x7fffffff是一个很好的选择。
然而0x7ffffff在很多情况下,并不是一个很好的选择。
(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]会溢出而变成负数,这样松弛操作就会出错了。
(2)除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,
      至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。

所以,这里我们认为无穷大应该满足以下性质:
(1)无穷大加上一个有穷的数依旧是无穷大
(2)无穷大加无穷大依然是无穷大

所以我们使用另一个常量来代替0x7fffffff。这个数就是0x3f3f3f3f。原因如下:
(1)0x3f3f3f3f=1061109567,是一个109 级别的,和0c7fffffff=2147483647 是同一个数量级。
        在一般的场合下,要求的数据都是小于10级别的,所以不会出现使用0x3f3f3f3f作为无穷大,其他数据大于无穷大的情形。
(2)由于一般数据都不会大于10级别,所以当无穷大加上一个数据时,并不会溢出,同时还满足0x3f3f3f3f+0x3f3f3f3f=2122219134,这个数依旧没有超过32-bit int表示的范围,所以还满足“无穷大加无穷大依旧是无穷大”的需求。

综上,在通常条件下,我们将无穷大设置为0x3F3F3F3F.





原文地址:https://www.cnblogs.com/gt123/p/3475157.html