zoukankan      html  css  js  c++  java
  • 编程中关于无穷大的设定技巧

    在很多情况下,都是用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.





  • 相关阅读:
    Load与onload的区别
    理解.NET中的CLR原理(二)
    用JS实现网站的繁体简体版
    JQUERY获取text,areatext,radio,checkbox,select值
    SQL Server 存储过程的分页方案比拼
    理解.NET中的CLR原理(三)
    请慎用ASP.Net的validateRequest="false"~
    请慎用ASP.Net的validateRequest="false"~
    GridView中的超链接
    GridView中的超链接
  • 原文地址:https://www.cnblogs.com/gt123/p/3475157.html
Copyright © 2011-2022 走看看